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