OverlayPlaneBase.cpp revision c90f6a1247780413b7396e72d8b095227438f51e
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>
3365efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <PhysicalDevice.h>
34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/OverlayPlaneBase.h>
35d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/TTMBufferMapper.h>
36d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/GrallocSubBuffer.h>
3723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx#include <DisplayQuery.h>
3823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx
39d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu// FIXME: remove it
41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <OMX_IVCommon.h>
42d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
43d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android {
44d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel {
45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp)
47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    : DisplayPlane(index, PLANE_OVERLAY, disp),
48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mTTMBuffers(),
49c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li      mActiveTTMBuffers(),
50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mBackBuffer(0),
51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mWsbm(0),
526a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu      mPipeConfig(0),
536a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu      mDisablePending(false),
546a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu      mDisablePendingDevice(0),
556a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu      mDisablePendingCount(0)
56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
57d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
58d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
59d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
60d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase()
61d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
63d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
64d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
65d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount)
66d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
67d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
68d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
70e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // NOTE: use overlay's data buffer count for the overlay plane
71e2ad4c047651d4442f6a0e002290016d45e9201afu jin    if (bufferCount < OVERLAY_DATA_BUFFER_COUNT) {
72e2ad4c047651d4442f6a0e002290016d45e9201afu jin        ITRACE("override overlay buffer count from %d to %d",
73e2ad4c047651d4442f6a0e002290016d45e9201afu jin             bufferCount, OVERLAY_DATA_BUFFER_COUNT);
74e2ad4c047651d4442f6a0e002290016d45e9201afu jin        bufferCount = OVERLAY_DATA_BUFFER_COUNT;
75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
76e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    if (!DisplayPlane::initialize(bufferCount)) {
77e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu        DEINIT_AND_RETURN_FALSE("failed to initialize display plane");
78e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    }
79e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu
80e2ad4c047651d4442f6a0e002290016d45e9201afu jin    mTTMBuffers.setCapacity(bufferCount);
81c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveTTMBuffers.setCapacity(MIN_DATA_BUFFER_COUNT);
82d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
83d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // init wsbm
84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mWsbm = new Wsbm(drm->getDrmFd());
85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mWsbm || !mWsbm->initialize()) {
86d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to create wsbm");
87d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
88d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // create overlay back buffer
90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mBackBuffer = createBackBuffer();
91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer) {
92d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer");
93d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
94d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
95d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // reset back buffer
96d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    resetBackBuffer();
97d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
98e2ad4c047651d4442f6a0e002290016d45e9201afu jin
99e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // disable overlay when created
100e2ad4c047651d4442f6a0e002290016d45e9201afu jin    flush(PLANE_DISABLE);
1016a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
1026a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    // overlay by default is in "disabled" status
1036a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePending = false;
1046a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePendingDevice = 0;
1056a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePendingCount = 0;
106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize()
110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
111e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    if (mTTMBuffers.size()) {
112e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu        invalidateBufferCache();
113e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    }
114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
115c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveTTMBuffers.size() > 0) {
116c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveTTMBuffers();
117c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
118c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
119e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    if (mBackBuffer) {
120e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu        deleteBackBuffer();
121e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    }
122e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu
123eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DEINIT_AND_DELETE_OBJ(mWsbm);
124e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu
125e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu    DisplayPlane::deinitialize();
126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1286a56bd739af22a3c34067426edbb3082504d8e03Andy Qiubool OverlayPlaneBase::setDataBuffer(uint32_t handle)
1296a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu{
1306a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    if (mDisablePending) {
1316a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        if (isFlushed() || mDisablePendingCount >= OVERLAY_DISABLING_COUNT_MAX) {
1326a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePending = false;
1336a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingDevice = 0;
1346a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingCount = 0;
1356a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            enable();
1366a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        } else {
1376a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingCount++;
1386a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            WTRACE("overlay %d disabling on device %d is still pending, count: %d",
1396a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu                mIndex, mDisablePendingDevice, mDisablePendingCount);
1406a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            return false;
1416a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        }
1426a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    }
1436a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
1446a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    return DisplayPlane::setDataBuffer(handle);
1456a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu}
1466a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache()
148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // clear plane buffer cache
150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    DisplayPlane::invalidateBufferCache();
151c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu    invalidateTTMBuffers();
152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp)
155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t pipeConfig = 0;
157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
1596a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    DTRACE("overlay %d assigned to disp %d", mIndex, disp);
160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch (disp) {
162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_EXTERNAL:
163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pipeConfig = (0x2 << 6);
164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_PRIMARY:
166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
167d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pipeConfig = 0;
168d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // if pipe switching happened, then disable overlay first
1726a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    if (mPipeConfig != pipeConfig) {
1736a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        DTRACE("overlay %d switched from %d to %d", mIndex, mDevice, disp);
174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        disable();
1756a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    }
176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mPipeConfig = pipeConfig;
178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mDevice = disp;
179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1806a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    if (!mDisablePending) {
1816a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        enable();
1826a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    }
1836a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
184d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
185d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
186d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
187d191dc7a785f312ede10d711720d8ca32a71b44cJackie Livoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& zorderConfig,
188d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li                                            void *nativeConfig)
189d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
190d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
191d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
192d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
193d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    if (!backBuffer)
194d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        return;
195d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
196d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    // setup overlay z order
197d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    int ovaZOrder = -1;
198d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    int ovcZOrder = -1;
199d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    for (size_t i = 0; i < zorderConfig.size(); i++) {
200d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        DisplayPlane *plane = zorderConfig.itemAt(i);
201d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        if (plane->getType() == DisplayPlane::PLANE_OVERLAY) {
202d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li            if (plane->getIndex() == 0) {
203d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li                ovaZOrder = i;
204d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li            } else if (plane->getIndex() == 1) {
205d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li                ovcZOrder = i;
206d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li            }
207d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        }
208d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    }
209d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
210d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    // force overlay c above overlay a
211d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li    if ((ovaZOrder >= 0) && (ovaZOrder < ovcZOrder)) {
212d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        backBuffer->OCONFIG |= (1 << 15);
213d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    } else {
214d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        backBuffer->OCONFIG &= ~(1 << 15);
215d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    }
216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
218d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset()
219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
220d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
2226a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    if (mDisablePending) {
2236a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        if (isFlushed() || mDisablePendingCount >= OVERLAY_DISABLING_COUNT_MAX) {
2246a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePending = false;
2256a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingDevice = 0;
2266a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingCount = 0;
2276a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        } else {
2286a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            mDisablePendingCount++;
2296a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            WTRACE("overlay %d disabling is still pending on device %d, count %d",
2306a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu                 mIndex, mDisablePendingDevice, mDisablePendingCount);
2316a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu            return false;
2326a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        }
2336a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    }
2346a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
235c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    DisplayPlane::reset();
236c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
237c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // invalidate active TTM buffers
238c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveTTMBuffers.size() > 0) {
239c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        invalidateActiveTTMBuffers();
240c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
241c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
242d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // reset back buffer
243d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    resetBackBuffer();
244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
246d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable()
249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer)
253d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
254d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
255d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (backBuffer->OCMD & 0x1)
256d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return true;
257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
258d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD |= 0x1;
259d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // flush
2614a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    flush(PLANE_ENABLE);
262d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
263d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
265d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable()
266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer)
270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!(backBuffer->OCMD & 0x1))
273d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return true;
274d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
2756a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    if (mDisablePending) {
2766a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        WTRACE("overlay %d disabling is still pending on device %d, skip disabling",
2776a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu             mIndex, mDisablePendingDevice);
2786a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu        return true;
2796a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    }
2806a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
281d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD &= ~0x1;
282d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
283d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // flush
2844a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    flush(PLANE_DISABLE);
2856a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu
2866a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    // "disable" is asynchronous and needs at least one vsync to complete
2876a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePending = true;
2886a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePendingDevice = mDevice;
2896a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu    mDisablePendingCount = 0;
290d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
291d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
292d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer()
294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
297eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // create back buffer
298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    OverlayBackBuffer *backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer));
299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!backBuffer) {
300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        ETRACE("failed to allocate back buffer");
301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return 0;
302d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
304d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    int size = sizeof(OverlayBackBufferBlk);
306eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    int alignment = 64 * 1024;
307eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void *wsbmBufferObject = 0;
308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bool ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject);
309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (ret == false) {
3103f1974031c88750a14adc8f2f49538837238abf9Lin Xie        ETRACE("failed to allocate TTM buffer");
311eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return 0;
312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
313d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
314eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void *virtAddr = mWsbm->getCPUAddress(wsbmBufferObject);
315eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    uint32_t gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject);
316eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
317d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->buf = (OverlayBackBufferBlk *)virtAddr;
318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->gttOffsetInPage = gttOffsetInPage;
319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->bufObject = (uint32_t)wsbmBufferObject;
320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
321d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage);
322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return backBuffer;
324d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer()
327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
328d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer)
329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
331eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void *wsbmBufferObject = (void *)mBackBuffer->bufObject;
332eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bool ret = mWsbm->destroyTTMBuffer(wsbmBufferObject);
333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
3343f1974031c88750a14adc8f2f49538837238abf9Lin Xie        WTRACE("failed to destroy TTM buffer");
335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // free back buffer
337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    free(mBackBuffer);
338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mBackBuffer = 0;
339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
341d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::resetBackBuffer()
342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!mBackBuffer || !mBackBuffer->buf)
346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    memset(backBuffer, 0, sizeof(OverlayBackBufferBlk));
351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
35265efc253a628175c7afa95c431b746ea20052794Andy Qiu    // reset overlay
353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) |
354d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         (OVERLAY_INIT_BRIGHTNESS & 0xff);
355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION;
356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY;
357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK;
358d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG = 0;
359d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG |= (0x1 << 3);
360d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG |= (0x1 << 27);
361d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SCHRKEN &= ~(0x7 << 24);
362d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SCHRKEN |= 0xff;
363d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
364d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper)
366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
367d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct VideoPayloadBuffer *payload;
368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t khandle;
369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t w, h;
370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride, uvStride;
371d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    stride_t stride;
372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int srcX, srcY, srcW, srcH;
373d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int tmp;
374d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
375d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    DataBuffer *buf;
376d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ssize_t index;
377d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    TTMBufferMapper *mapper;
378d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
379d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
380d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1);
381d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!payload) {
382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid payload buffer");
383d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return 0;
384d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
385d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
386d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // init ttm buffer
387d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    khandle = payload->rotated_buffer_handle;
388d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    index = mTTMBuffers.indexOfKey(khandle);
389d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (index < 0) {
390d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        VTRACE("unmapped TTM buffer, will map it");
391d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
392d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        w = payload->rotated_width;
393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        h = payload->rotated_height;
394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcX = grallocMapper.getCrop().x;
395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcY = grallocMapper.getCrop().y;
396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcW = grallocMapper.getCrop().w;
397d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcH = grallocMapper.getCrop().h;
398d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
399d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (mTransform == PLANE_TRANSFORM_90 || mTransform == PLANE_TRANSFORM_270) {
400d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tmp = srcH;
401d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcH = srcW;
402d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcW = tmp;
403d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tmp = srcX;
405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX = srcY;
406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY = tmp;
407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // skip pading bytes in rotate buffer
410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        switch(mTransform) {
411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_90:
412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX += ((srcW + 0xf) & ~0xf) - srcW;
413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_180:
415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX += ((srcW + 0xf) & ~0xf) - srcW;
416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY += ((srcH + 0xf) & ~0xf) - srcH;
417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_270:
419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY += ((srcH + 0xf) & ~0xf) - srcH;
420d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
421d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        default:
422d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
423d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
424d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
425d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // calculate stride
426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        switch (grallocMapper.getFormat()) {
427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_YV12:
428d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_I420:
42923921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            uint32_t yStride_align;
4304a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li            yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat());
4314a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li            if (yStride_align > 0)
43223921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            {
43323921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx                yStride = align_to(align_to(w, 32), yStride_align);
43423921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            }
43523921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            else
43623921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            {
43723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx                yStride = align_to(align_to(w, 32), 64);
43823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx            }
439d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = align_to(yStride >> 1, 64);
440d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
441d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
442d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
443eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        case HAL_PIXEL_FORMAT_NV12:
444eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu            yStride = align_to(align_to(w, 32), 64);
445eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu            uvStride = yStride;
446eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu            stride.yuv.yStride = yStride;
447eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu            stride.yuv.uvStride = uvStride;
448eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu            break;
449d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:
4503b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:
451d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            yStride = align_to(align_to(w, 32), 64);
452d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = yStride;
453d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
454d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
455d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
456d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_YUY2:
457d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_UYVY:
458d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            yStride = align_to((align_to(w, 32) << 1), 64);
459d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = 0;
460d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
461d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
462d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
463d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
464d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        DataBuffer buf(khandle);
466d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // update buffer
467eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        buf.setStride(stride);
468eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        buf.setWidth(w);
469eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        buf.setHeight(h);
470eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        buf.setCrop(srcX, srcY, srcW, srcH);
471eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        buf.setFormat(grallocMapper.getFormat());
472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // create buffer mapper
474eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bool res = false;
475eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        do {
476eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            mapper = new TTMBufferMapper(*mWsbm, buf);
477eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            if (!mapper) {
478eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                ETRACE("failed to allocate mapper");
479eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                break;
480eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            }
481eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            // map ttm buffer
482eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            ret = mapper->map();
483eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            if (!ret) {
484eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                ETRACE("failed to map");
485c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu                invalidateTTMBuffers();
48624d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu                ret = mapper->map();
48724d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu                if (!ret) {
48824d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu                    ETRACE("failed to remap");
48924d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu                    break;
49024d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu                }
49124d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu            }
49224d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu
49324d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu            if (mTTMBuffers.size() >= OVERLAY_DATA_BUFFER_COUNT) {
494c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu                invalidateTTMBuffers();
495eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            }
496d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
497eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            // add mapper
498eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            index = mTTMBuffers.add(khandle, mapper);
499eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            if (index < 0) {
500eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                ETRACE("failed to add TTMMapper");
501eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                break;
502eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            }
503c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
504eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            // increase mapper refCount since it is added to mTTMBuffers
505eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            mapper->incRef();
506eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            res = true;
507eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        } while (0);
508eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
509eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (!res) {
510eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            // error handling
511eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            if (mapper) {
512eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                mapper->unmap();
513eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                delete mapper;
514eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                mapper = NULL;
515eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            }
516eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            return 0;
517d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
518d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
519d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        VTRACE("got mapper in saved ttm buffers");
520d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index));
521d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
522d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
523d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
524d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return mapper;
525d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
526d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
527d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper)
528d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
529d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mapper)
530d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
531d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
532c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!mapper->decRef()) {
533c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // unmap it
534c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper->unmap();
535c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
536c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // destroy this mapper
537c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        delete mapper;
538c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
539c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
540d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
541c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool OverlayPlaneBase::isActiveTTMBuffer(BufferMapper *mapper)
542c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
543c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) {
544c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *activeMapper = mActiveTTMBuffers.itemAt(i);
545c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (!activeMapper)
546c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            continue;
547c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        if (activeMapper->getKey() == mapper->getKey())
548c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li            return true;
549c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
550d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
551c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    return false;
552c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
553c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
554c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::updateActiveTTMBuffers(BufferMapper *mapper)
555c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
556c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // unmap the first entry (oldest buffer)
557c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (mActiveTTMBuffers.size() >= MIN_DATA_BUFFER_COUNT) {
558c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        BufferMapper *oldest = mActiveTTMBuffers.itemAt(0);
559c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        putTTMMapper(oldest);
560c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveTTMBuffers.removeAt(0);
561c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
562c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
563c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // queue it to cached buffers
564c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (!isActiveTTMBuffer(mapper)) {
565c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper->incRef();
566c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mActiveTTMBuffers.push_back(mapper);
567c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
568c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li}
569c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
570c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::invalidateActiveTTMBuffers()
571c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{
572c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper* mapper;
573c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
574c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    RETURN_VOID_IF_NOT_INIT();
575c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
576c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) {
577c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        mapper = mActiveTTMBuffers.itemAt(i);
578c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // unmap it
579c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        putTTMMapper(mapper);
580c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
581c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
582c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // clear recorded data buffers
583c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    mActiveTTMBuffers.clear();
584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
586c90f6a1247780413b7396e72d8b095227438f51eAndy Qiuvoid OverlayPlaneBase::invalidateTTMBuffers()
587c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu{
588c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu    BufferMapper* mapper;
589c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu    for (size_t i = 0; i < mTTMBuffers.size(); i++) {
590c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu        mapper = mTTMBuffers.valueAt(i);
591c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu        // putTTMMapper removes mapper from cache
592c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu        putTTMMapper(mapper);
593c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu    }
594c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu    mTTMBuffers.clear();
595c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu}
596c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu
597d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper)
598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct VideoPayloadBuffer *payload;
600d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format;
601d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
602d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // only NV12_VED has rotated buffer
603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    format = mapper.getFormat();
6043b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi    if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar &&
6053b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled)
606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1);
609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // check payload
610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!payload) {
611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("no payload found");
612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
615d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (payload->force_output_method == FORCE_OUTPUT_GPU)
616d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
617d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
618d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (payload->client_transform != mTransform) {
61951e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang        if (payload->surface_protected) {
62051e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang            payload->hwc_timestamp = systemTime();
62151e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang            payload->layer_transform = mTransform;
62251e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang        }
623d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        WTRACE("client is not ready");
624d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
625d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
626d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
627d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
628d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
629d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
630d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h)
631d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
632d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
63330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfo modeInfo;
63430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    if (!drm->getModeInfo(mDevice, modeInfo)) {
63530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu        ETRACE("failed to get mode info");
636d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
637d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
63830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    drmModeModeInfoPtr mode = &modeInfo;
639d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
640d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (x < 0)
641d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        x = 0;
642d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (y < 0)
643d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        y = 0;
644d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((x + w) > mode->hdisplay)
645d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        w = mode->hdisplay - x;
646d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((y + h) > mode->vdisplay)
647d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        h = mode->vdisplay - y;
648d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
649d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
650d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper)
651d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
652d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
653d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
654d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
660d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format = mapper.getFormat();
661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12);
662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride = mapper.getStride().yuv.yStride;
663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t uvStride = mapper.getStride().yuv.uvStride;
664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t w = mapper.getWidth();
665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t h = mapper.getHeight();
666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcX= mapper.getCrop().x;
667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcY= mapper.getCrop().y;
668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // clear original format setting
670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD &= ~(0xf << 10);
6713b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi    backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED;
672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // Y/U/V plane must be 4k bytes aligned.
674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0Y = gttOffsetInBytes;
675927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu    if (mIsProtectedBuffer) {
676927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // temporary workaround until vsync event logic is corrected.
677927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // it seems that overlay buffer update and renderring can be overlapped,
678927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // as such encryption bit may be cleared during HW rendering
679927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        backBuffer->OSTART_0Y |= 0x01;
680927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu    }
681927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu
682d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0U = gttOffsetInBytes;
683d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0V = gttOffsetInBytes;
684d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
685d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1Y = backBuffer->OSTART_0Y;
686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1U = backBuffer->OSTART_0U;
687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1V = backBuffer->OSTART_0V;
688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch(format) {
69065efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_YV12:    // YV12
691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = yStride * h;
693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2));
694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
69665efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_I420:    // I420
697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = yStride * h;
699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2));
700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
702eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu    case HAL_PIXEL_FORMAT_NV12:    // NV12
703eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        backBuffer->OBUF_0Y = 0;
704eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        backBuffer->OBUF_0U = yStride * align_to(h, 32);
705eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        backBuffer->OBUF_0V = 0;
706eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
707eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu        break;
70865efc253a628175c7afa95c431b746ea20052794Andy Qiu    // NOTE: this is the decoded video format, align the height to 32B
70965efc253a628175c7afa95c431b746ea20052794Andy Qiu    //as it's defined by video driver
71065efc253a628175c7afa95c431b746ea20052794Andy Qiu    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:    // NV12
711d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
712d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = yStride * align_to(h, 32);
713d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
714d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
715d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
7163b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:  //NV12_tiled
7173b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OBUF_0Y = 0;
7183b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OBUF_0U = yStride * align_to(h, 32);
7193b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OBUF_0V = 0;
7203b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OSTART_0U += yStride * align_to(h, 32);
7213b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OSTART_0V += yStride * align_to(h, 32);
7223b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OSTART_1U = backBuffer->OSTART_0U;
7233b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OSTART_1V = backBuffer->OSTART_0V;
7243b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_0Y = srcX + (srcY << 16);
7253b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_1Y = backBuffer->OTILEOFF_0Y;
7263b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_0U = srcX + ((srcY / 2) << 16);
7273b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_1U = backBuffer->OTILEOFF_0U;
7283b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_0V = backBuffer->OTILEOFF_0U;
7293b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OTILEOFF_1V = backBuffer->OTILEOFF_0U;
7303b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
7313b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED;
7323b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi        break;
73365efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_YUY2:    // YUY2
734d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
735d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = 0;
736d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
737d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
738d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2;
739d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
74065efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_UYVY:    // UYVY
741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = 0;
743d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY;
746d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("unsupported format %d", format);
749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0Y += srcY * yStride + srcX;
753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX;
754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX;
755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1Y = backBuffer->OBUF_0Y;
756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1U = backBuffer->OBUF_0U;
757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1V = backBuffer->OBUF_0V;
758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("done. offset (%d, %d, %d)",
760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0Y,
761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0U,
762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0V);
763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width)
767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ATRACE("offset = %d, width = %d", offset, width);
769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6);
771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidth <<= 1;
773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidth -= 1;
774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return swidth;
776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper)
779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidthy = 0;
789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidthuv = 0;
790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format = mapper.getFormat();
791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t width = mapper.getCrop().w;
792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t height = mapper.getCrop().h;
793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride = mapper.getStride().yuv.yStride;
794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t uvStride = mapper.getStride().yuv.uvStride;
795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t offsety = backBuffer->OBUF_0Y;
796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t offsetu = backBuffer->OBUF_0U;
797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch (format) {
79965efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_YV12:              // YV12
80065efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_I420:              // I420
801eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu    case HAL_PIXEL_FORMAT_NV12:              // NV12
80265efc253a628175c7afa95c431b746ea20052794Andy Qiu    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:          // NV12
8033b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:    // NV12_tiled
804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
80565efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_YUY2:              // YUY2
80665efc253a628175c7afa95c431b746ea20052794Andy Qiu    case HAL_PIXEL_FORMAT_UYVY:              // UYVY
807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        width <<= 1;
808d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
809d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("unsupported format %d", format);
811d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
812d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
813d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (width <= 0 || height <= 0) {
815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid src dim");
816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (yStride <=0 && uvStride <= 0) {
820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid source stride");
821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SWIDTH = width | ((width / 2) << 16);
825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidthy = calculateSWidthSW(offsety, width);
826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidthuv = calculateSWidthSW(offsetu, width / 2);
827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18);
828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SHEIGHT = height | ((height / 2) << 16);
829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16);
830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize,
837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                  coeffPtr pCoeff, int pos)
838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int maxVal, icoeff, res;
840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int sign;
841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double c;
842d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
843d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    sign = 0;
844d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    maxVal = 1 << mantSize;
845d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    c = *coeff;
846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (c < 0.0) {
847d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sign = 1;
848d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        c = -c;
849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
850d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
851d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    res = 12 - mantSize;
852d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) {
853d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 3;
854d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
855d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(4 * maxVal);
856d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) {
857d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 2;
858d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
859d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(2 * maxVal);
860d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) {
861d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 1;
862d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
863d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(maxVal);
864d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) {
865d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 0;
866d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
867d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(maxVal / 2);
868d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
86965efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Coeff out of range
870d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
871d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
872d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
873d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    pCoeff[pos].sign = sign;
874d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (sign)
875d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = -(*coeff);
876d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
877d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
878d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff,
880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                 bool isHoriz, bool isY,
881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                 coeffPtr pCoeff)
882d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
883d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int i, j, j1, num, pos, mantSize;
884d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double pi = 3.1415926535, val, sinc, window, sum;
885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS];
886d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double diff;
887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int tapAdjust[MAX_TAPS], tap2Fix;
888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool isVertAndUV;
889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
890d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (isHoriz)
891d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mantSize = 7;
892d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    else
893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mantSize = 6;
894d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
895d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    isVertAndUV = !isHoriz && !isY;
896d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    num = taps * 16;
897d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    for (i = 0; i < num  * 2; i++) {
898d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num);
899d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (val == 0.0)
900d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sinc = 1.0;
901d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        else
902d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sinc = sin(val) / val;
903d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
90465efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Hamming window
905d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1)));
906d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        rawCoeff[i] = sinc * window;
907d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
908d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
909d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    for (i = 0; i < N_PHASES; i++) {
91065efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Normalise the coefficients
911d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sum = 0.0;
912d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
913d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = i + j * 32;
914d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sum += rawCoeff[pos];
915d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
916d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
917d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = i + j * 32;
918d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            coeffs[i][j] = rawCoeff[pos] / sum;
919d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
920d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
92165efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Set the register values
922d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
923d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = j + i * taps;
924d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            if ((j == (taps - 1) / 2) && !isVertAndUV)
925d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos);
926d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            else
927d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos);
928d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
929d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
930d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        tapAdjust[0] = (taps - 1) / 2;
931d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) {
932d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tapAdjust[j1] = tapAdjust[0] - j;
933d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tapAdjust[++j1] = tapAdjust[0] + j;
934d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
935d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
93665efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Adjust the coefficients
937d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sum = 0.0;
938d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++)
939d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sum += coeffs[i][j];
940d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (sum != 1.0) {
941d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j1 = 0; j1 < taps; j1++) {
942d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                tap2Fix = tapAdjust[j1];
943d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                diff = 1.0 - sum;
944d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                coeffs[i][tap2Fix] += diff;
945d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = tap2Fix + i * taps;
946d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV)
947d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos);
948d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                else
949d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos);
950d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
951d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                sum = 0.0;
952d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                for (j = 0; j < taps; j++)
953d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    sum += coeffs[i][j];
954d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                if (sum == 1.0)
955d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    break;
956d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
957d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
958d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
959d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
960d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
961d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper)
962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int xscaleIntUV, xscaleFractUV;
965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int yscaleIntUV, yscaleFractUV;
966d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int deinterlace_factor = 1;
96765efc253a628175c7afa95c431b746ea20052794Andy Qiu    // UV is half the size of Y -- YUV420
968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int uvratio = 2;
969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t newval;
970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES];
971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES];
972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int i, j, pos;
973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool scaleChanged = false;
974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int x, y, w, h;
975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    x = mPosition.x;
983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    y = mPosition.y;
984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    w = mPosition.w;
985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    h = mPosition.h;
986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // check position
988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    checkPosition(x, y, w, h);
989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("final position (%d, %d, %d, %d)", x, y, w, h);
990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((w <= 0) || (h <= 0)) {
992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu         ETRACE("invalid dst width/height");
993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu         return false;
994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // setup dst position
997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DWINPOS = (y << 16) | x;
998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DWINSZ = (h << 16) | w;
999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcWidth = mapper.getCrop().w;
1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcHeight = mapper.getCrop().h;
1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t dstWidth = w;
1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t dstHeight = h;
1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("src (%dx%d), dst (%dx%d)",
1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          srcWidth, srcHeight,
1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          dstWidth, dstHeight);
100865efc253a628175c7afa95c431b746ea20052794Andy Qiu
100965efc253a628175c7afa95c431b746ea20052794Andy Qiu     // Y down-scale factor as a multiple of 4096
1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (srcWidth == dstWidth && srcHeight == dstHeight) {
1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        xscaleFract = (1 << 12);
1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        yscaleFract = (1 << 12)/deinterlace_factor;
1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        xscaleFract = ((srcWidth - 1) << 12) / dstWidth;
1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor);
1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
101865efc253a628175c7afa95c431b746ea20052794Andy Qiu    // Calculate the UV scaling factor
1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleFractUV = xscaleFract / uvratio;
1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleFractUV = yscaleFract / uvratio;
1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
102265efc253a628175c7afa95c431b746ea20052794Andy Qiu
102365efc253a628175c7afa95c431b746ea20052794Andy Qiu    // To keep the relative Y and UV ratios exact, round the Y scales
102465efc253a628175c7afa95c431b746ea20052794Andy Qiu    // to a multiple of the Y/UV ratio.
1025d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleFract = xscaleFractUV * uvratio;
1026d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleFract = yscaleFractUV * uvratio;
1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
102865efc253a628175c7afa95c431b746ea20052794Andy Qiu    // Integer (un-multiplied) values
1029d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleInt = xscaleFract >> 12;
1030d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleInt = yscaleFract >> 12;
1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleIntUV = xscaleFractUV >> 12;
1033d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleIntUV = yscaleFractUV >> 12;
1034d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
103565efc253a628175c7afa95c431b746ea20052794Andy Qiu    // Check scaling ratio
1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) {
1037d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
1038d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
104165efc253a628175c7afa95c431b746ea20052794Andy Qiu    // shouldn't get here
1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) {
1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1045d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = (xscaleInt << 15) |
1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20);
1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->YRGBSCALE) {
1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->YRGBSCALE = newval;
1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) |
1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ((yscaleFractUV & 0xFFF) << 20);
1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->UVSCALE) {
1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->UVSCALE = newval;
1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = yscaleInt << 16 | yscaleIntUV;
1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->UVSCALEV) {
1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
1064d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->UVSCALEV = newval;
1065d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1066d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
106765efc253a628175c7afa95c431b746ea20052794Andy Qiu    // Recalculate coefficients if the scaling changed
106865efc253a628175c7afa95c431b746ea20052794Andy Qiu    // Only Horizontal coefficients so far.
1069d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (scaleChanged) {
1070d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        double fCutoffY;
1071d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        double fCutoffUV;
1072d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1073d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        fCutoffY = xscaleFract / 4096.0;
1074d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        fCutoffUV = xscaleFractUV / 4096.0;
1075d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
107665efc253a628175c7afa95c431b746ea20052794Andy Qiu        // Limit to between 1.0 and 3.0
1077d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffY < MIN_CUTOFF_FREQ)
1078d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffY = MIN_CUTOFF_FREQ;
1079d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffY > MAX_CUTOFF_FREQ)
1080d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffY = MAX_CUTOFF_FREQ;
1081d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffUV < MIN_CUTOFF_FREQ)
1082d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffUV = MIN_CUTOFF_FREQ;
1083d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffUV > MAX_CUTOFF_FREQ)
1084d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffUV = MAX_CUTOFF_FREQ;
1085d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1086d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY);
1087d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV);
1088d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1089d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (i = 0; i < N_PHASES; i++) {
1090d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j = 0; j < N_HORIZ_Y_TAPS; j++) {
1091d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = i * N_HORIZ_Y_TAPS + j;
1092d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                backBuffer->Y_HCOEFS[pos] =
1093d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                        (xcoeffY[pos].sign << 15 |
1094d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         xcoeffY[pos].exponent << 12 |
1095d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         xcoeffY[pos].mantissa);
1096d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
1097d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1098d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (i = 0; i < N_PHASES; i++) {
1099d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j = 0; j < N_HORIZ_UV_TAPS; j++) {
1100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = i * N_HORIZ_UV_TAPS + j;
1101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                backBuffer->UV_HCOEFS[pos] =
1102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         (xcoeffUV[pos].sign << 15 |
1103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                          xcoeffUV[pos].exponent << 12 |
1104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                          xcoeffUV[pos].mantissa);
1105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
1106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
1110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
1111d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
1112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper)
1114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
1115d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    BufferMapper *mapper;
1116c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    BufferMapper *rotatedMapper = 0;
1117d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
1118d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1119d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
1120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // get gralloc mapper
1122d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mapper = &grallocMapper;
112304d73e173c3d70cef309f8a9e3517ebd5dcf7b49Lin Xie    if (mTransform) {
1124d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!rotatedBufferReady(grallocMapper)) {
1125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            WTRACE("rotated buffer is not ready");
1126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            return false;
1127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1128d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1129d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // get rotated data buffer mapper
1130d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = getTTMMapper(grallocMapper);
1131d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!mapper) {
1132d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to get rotated buffer");
1133d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            return false;
1134d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1135c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
1136c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        rotatedMapper = mapper;
1137d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1138d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1139d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
1140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
1141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
1142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = bufferOffsetSetup(*mapper);
1146d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up buffer offsets");
1148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = coordinateSetup(*mapper);
1152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up overlay coordinates");
1154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = scalingSetup(*mapper);
1158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up scaling parameters");
1160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD |= 0x1;
11644a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
1165c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // add to active ttm buffers if it's a rotated buffer
1166c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    if (rotatedMapper) {
1167c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        updateActiveTTMBuffers(mapper);
1168c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    }
1169c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
1170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
1171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
1172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1173d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel
1174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android
1175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1176