1a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang/*
2a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// Copyright (c) 2014 Intel Corporation
3a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang//
4a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// Licensed under the Apache License, Version 2.0 (the "License");
5a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// you may not use this file except in compliance with the License.
6a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// You may obtain a copy of the License at
7a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang//
8a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang//      http://www.apache.org/licenses/LICENSE-2.0
9a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang//
10a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// Unless required by applicable law or agreed to in writing, software
11a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// distributed under the License is distributed on an "AS IS" BASIS,
12a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// See the License for the specific language governing permissions and
14a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang// limitations under the License.
15a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang*/
16a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
17a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <common/utils/HwcTrace.h>
18a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <Hwcomposer.h>
19a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <BufferManager.h>
20a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <ips/anniedale/AnnCursorPlane.h>
21a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <ips/tangier/TngGrallocBuffer.h>
22a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang#include <hal_public.h>
23a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
24a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangnamespace android {
25a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangnamespace intel {
26a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
27a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei ZhangAnnCursorPlane::AnnCursorPlane(int index, int disp)
28a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    : DisplayPlane(index, PLANE_CURSOR, disp)
29a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
30a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    CTRACE();
31a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    memset(&mContext, 0, sizeof(mContext));
32a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    memset(&mCrop, 0, sizeof(mCrop));
33a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
34a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
35a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei ZhangAnnCursorPlane::~AnnCursorPlane()
36a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
37a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    CTRACE();
38a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
39a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
40a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::enable()
41a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
42a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return enablePlane(true);
43a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
44a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
45a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::disable()
46a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
47a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return enablePlane(false);
48a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
49a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
502742b87cd9966a175bc6f5713eb26657f958f366Byron Gardnerbool AnnCursorPlane::reset()
512742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner{
522742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner    // clear mCrop once reset
532742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner    memset(&mCrop, 0, sizeof(mCrop));
542742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner    return true;
552742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner}
562742b87cd9966a175bc6f5713eb26657f958f366Byron Gardner
57a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangvoid* AnnCursorPlane::getContext() const
58a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
59a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    CTRACE();
60a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return (void *)&mContext;
61a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
62a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
63a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangvoid AnnCursorPlane::setZOrderConfig(ZOrderConfig& config, void *nativeConfig)
64a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
65a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    (void) config;
66a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    (void) nativeConfig;
67a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
68a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    CTRACE();
69a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
70a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
71a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::setDataBuffer(uint32_t handle)
72a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
73a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    bool ret;
74a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
75a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (!handle) {
76a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        ELOGTRACE("handle is NULL");
77a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return false;
78a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
79a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
80a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    ret = DisplayPlane::setDataBuffer(handle);
81a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (ret == false) {
82a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        ELOGTRACE("failed to set data buffer");
83a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return ret;
84a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
85a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
86a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return true;
87a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
88a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
89a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::setDataBuffer(BufferMapper& mapper)
90a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
91a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int w = mapper.getWidth();
92a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int h = mapper.getHeight();
93a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int cursorSize = 0;
94a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
95a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    CTRACE();
96a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
97a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // setup plane position
98a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int dstX = mPosition.x;
99a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int dstY = mPosition.y;
100a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
101a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (h < w) {
102a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cursorSize = h;
103a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else {
104a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cursorSize = w;
105a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
106a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
107a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    uint32_t cntr = 0;
108a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (64 <= cursorSize && cursorSize < 128) {
109a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cursorSize = 64;
110a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cntr = 0x7;
111a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else if (128 <= cursorSize && cursorSize < 256) {
112a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cursorSize = 128;
113a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cntr = 0x2;
114a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else {
115a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cursorSize = 256;
116a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cntr = 0x3;
117a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
118a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
119a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (mapper.getFormat() == HAL_PIXEL_FORMAT_RGBA_8888) {
120a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cntr |= 1 << 5;
121a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else if (mapper.getFormat() == HAL_PIXEL_FORMAT_BGRA_8888) {
122a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        // swap color from BGRA to RGBA - alpha is MSB
123a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        uint8_t *p = (uint8_t *)(mapper.getCpuAddress(0));
124a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        uint8_t *srcPixel;
125a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        uint32_t stride = mapper.getStride().rgb.stride;
126a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        uint8_t temp;
127a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        if (!p) {
128a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang            return false;
129a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        }
130a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
131a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        for (int i = 0; i < cursorSize; i++) {
132a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang            for (int j = 0; j < cursorSize; j++) {
133a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                srcPixel = p + i*stride + j*4;
134a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                temp = srcPixel[0];
135a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                srcPixel[0] = srcPixel[2];
136a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                srcPixel[2] = temp;
137a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang            }
138a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        }
139a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        cntr |= 1 << 5;
140a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else {
141a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        ELOGTRACE("invalid color format");
142a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return false;
143a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
144a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
145a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // TODO: clean spare mem to be 0 in gralloc instead
146a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    uint8_t *p = (uint8_t *)(mapper.getCpuAddress(0));
147a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    uint8_t *srcPixel;
148a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    uint32_t stride = mapper.getStride().rgb.stride;
149a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (!p) {
150a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return false;
151a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
152a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
153a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (mCrop.w == 0 && mCrop.h == 0) {
154a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        mCrop = mSrcCrop;
155a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        for (int i = 0; i < cursorSize; i++) {
156a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang            for (int j = 0; j < cursorSize; j++) {
157a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                srcPixel = p + i*stride + j*4;
158a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                if (i >= mCrop.h || j >= mCrop.w) {
159a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                    if (srcPixel[0] == 0 &&
160a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                        srcPixel[3] == 0xff)
161a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                        srcPixel[3] = 0;
162a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang                }
163a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang            }
164a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        }
165a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
166a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
167a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // update context
168a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.type = DC_CURSOR_PLANE;
169a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.index = mIndex;
170a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.pipe = mDevice;
171a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.cntr = cntr;
172a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.surf = mapper.getGttOffsetInPage(0) << 12;
173a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
174a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.pos = 0;
175a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (dstX < 0) {
176a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        mContext.ctx.cs_ctx.pos |= 1 << 15;
177a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        dstX = -dstX;
178a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
179a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (dstY < 0) {
180a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        mContext.ctx.cs_ctx.pos |= 1 << 31;
181a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        dstY = -dstY;
182a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
183a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    mContext.ctx.cs_ctx.pos |= (dstY & 0xfff) << 16 | (dstX & 0xfff);
184a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return true;
185a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
186a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
187a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::enablePlane(bool enabled)
188a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
189a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    RETURN_FALSE_IF_NOT_INIT();
190a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
191a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    struct drm_psb_register_rw_arg arg;
192a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
193a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (enabled) {
194a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        arg.plane_enable_mask = 1;
195a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    } else {
196a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        arg.plane_disable_mask = 1;
197a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
198a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
199a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.type = DC_CURSOR_PLANE;
200a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.index = mIndex;
201a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.ctx = 0;
202a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
203a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // issue ioctl
204a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    Drm *drm = Hwcomposer::getInstance().getDrm();
205a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
206a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (ret == false) {
207a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        WLOGTRACE("plane enabling (%d) failed with error code %d", enabled, ret);
208a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return false;
209a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
210a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
211a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return true;
212a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
213a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
214a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangbool AnnCursorPlane::isDisabled()
215a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
216a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    RETURN_FALSE_IF_NOT_INIT();
217a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
218a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    struct drm_psb_register_rw_arg arg;
219a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
220a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
221a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.type = DC_CURSOR_PLANE;
222a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.get_plane_state_mask = 1;
223a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.index = mIndex;
224a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    arg.plane.ctx = 0;
225a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
226a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // issue ioctl
227a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    Drm *drm = Hwcomposer::getInstance().getDrm();
228a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
229a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    if (ret == false) {
230a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        WLOGTRACE("plane state query failed with error code %d", ret);
231a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        return false;
232a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    }
233a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
234a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    return arg.plane.ctx == PSB_DC_PLANE_DISABLED;
235a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
236a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
237a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhangvoid AnnCursorPlane::postFlip()
238a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang{
239a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // prevent mUpdateMasks from being reset
240a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    // skipping flip may cause flicking
241a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang}
242a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang
243a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang} // namespace intel
244a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang} // namespace android
245