18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/* 28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License"); 58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License. 68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at 78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// http://www.apache.org/licenses/LICENSE-2.0 98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software 118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS, 128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and 148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License. 158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/ 168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h> 178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Hwcomposer.h> 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <BufferManager.h> 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <anniedale/AnnRGBPlane.h> 208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <tangier/TngGrallocBuffer.h> 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <common/PixelFormat.h> 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolAnnRGBPlane::AnnRGBPlane(int index, int type, int disp) 278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol : DisplayPlane(index, type, disp) 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&mContext, 0, sizeof(mContext)); 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolAnnRGBPlane::~AnnRGBPlane() 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::enable() 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return enablePlane(true); 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::disable() 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return enablePlane(false); 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid* AnnRGBPlane::getContext() const 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return (void *)&mContext; 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid AnnRGBPlane::setZOrderConfig(ZOrderConfig& config, void *nativeConfig) 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::setDataBuffer(buffer_handle_t handle) 608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!handle) { 628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol setFramebufferTarget(handle); 638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol TngGrallocBuffer tmpBuf(handle); 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t usage; 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret; 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ATRACE("handle = %#x", handle); 718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol usage = tmpBuf.getUsage(); 738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (GRALLOC_USAGE_HW_FB & usage) { 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol setFramebufferTarget(handle); 758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // use primary as a sprite 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = DisplayPlane::setDataBuffer(handle); 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to set data buffer"); 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return ret; 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::setDataBuffer(BufferMapper& mapper) 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int bpp; 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int srcX, srcY, srcW, srcH; 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int dstX, dstY, dstW, dstH; 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t spriteFormat; 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t stride; 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t linoff; 968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t planeAlpha; 978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol drmModeModeInfoPtr mode = &mModeInfo; 988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setup plane position 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol dstX = mPosition.x; 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol dstY = mPosition.y; 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol dstW = mPosition.w; 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol dstH = mPosition.h; 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol checkPosition(dstX, dstY, dstW, dstH); 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setup plane format 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!PixelFormat::convertFormat(mapper.getFormat(), spriteFormat, bpp)) { 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("unsupported format %#x", mapper.getFormat()); 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setup stride and source buffer crop 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol srcX = mapper.getCrop().x; 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol srcY = mapper.getCrop().y; 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol srcW = mapper.getWidth(); 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol srcH = mapper.getHeight(); 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = mapper.getStride().rgb.stride; 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mPanelOrientation == PANEL_ORIENTATION_180) 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol linoff = srcY * stride + srcX * bpp + (mapper.getCrop().h - 1) * stride + (mapper.getCrop().w - 1) * bpp; 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol linoff = srcY * stride + srcX * bpp; 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // unlikely happen, but still we need make sure linoff is valid 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (linoff > (stride * mapper.getHeight())) { 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid source crop"); 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // update context 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mType == PLANE_SPRITE) 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_SPRITE_PLANE; 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_PRIMARY_PLANE; 1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setup plane alpha 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 < mPlaneAlpha && mPlaneAlpha < 0xff) { 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol planeAlpha = mPlaneAlpha | 0x80000000; 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // disable plane alpha to offload HW 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol planeAlpha = 0xff; 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.index = mIndex; 1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.pipe = mDevice; 1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.cntr = spriteFormat | 0x80000000; 1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.linoff = linoff; 1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.stride = stride; 1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // turn off premultipled alpha blending for HWC_BLENDING_COVERAGE 1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mBlending == HWC_BLENDING_COVERAGE) { 1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.cntr |= (0x1 << 23); 1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mPanelOrientation == PANEL_ORIENTATION_180) 1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.cntr |= (0x1 << 15); 1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mapper.isCompression()) { 1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.stride = align_to(srcW, 32) * 4; 1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.linoff = (align_to(srcW, 32) * srcH / 64) - 1; 1648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.tileoff = (srcY & 0xfff) << 16 | (srcX & 0xfff); 1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.cntr |= (0x1 << 11); 1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.surf = mapper.getGttOffsetInPage(0) << 12; 1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.gtt_key = (uint64_t)mapper.getCpuAddress(0); 1708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mPanelOrientation == PANEL_ORIENTATION_180) { 1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mode->vdisplay && mode->hdisplay) 1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.pos = ((mode->vdisplay - dstY - dstH) & 0xfff) << 16 | ((mode->hdisplay - dstX - dstW) & 0xfff); 1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.pos = (dstY & 0xfff) << 16 | (dstX & 0xfff); 1768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 1778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.pos = (dstY & 0xfff) << 16 | (dstX & 0xfff); 1788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.size = 1818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ((dstH - 1) & 0xfff) << 16 | ((dstW - 1) & 0xfff); 1828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.contalpa = planeAlpha; 1838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.update_mask = SPRITE_UPDATE_ALL; 1848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("type = %d, index = %d, cntr = %#x, linoff = %#x, stride = %#x," 1868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol "surf = %#x, pos = %#x, size = %#x, contalpa = %#x", mType, mIndex, 1878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.cntr, 1888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.linoff, 1898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.stride, 1908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.surf, 1918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.pos, 1928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.size, 1938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.contalpa); 1948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::enablePlane(bool enabled) 1988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_FALSE_IF_NOT_INIT(); 2008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct drm_psb_register_rw_arg arg; 2028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 2038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (enabled) { 2048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_enable_mask = 1; 2058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 2068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_disable_mask = 1; 2078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mType == PLANE_SPRITE) 2108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_SPRITE_PLANE; 2118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 2128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_PRIMARY_PLANE; 2138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.index = mIndex; 2158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.ctx = 0; 2168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // issue ioctl 2188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Drm *drm = Hwcomposer::getInstance().getDrm(); 2198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 2208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 2218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("plane enabling (%d) failed with error code %d", enabled, ret); 2228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 2268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool AnnRGBPlane::isDisabled() 2298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_FALSE_IF_NOT_INIT(); 2318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct drm_psb_register_rw_arg arg; 2338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 2348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mType == PLANE_SPRITE) 2368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_SPRITE_PLANE; 2378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 2388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_PRIMARY_PLANE; 2398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.get_plane_state_mask = 1; 2418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.index = mIndex; 2428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.ctx = 0; 2438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // issue ioctl 2458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Drm *drm = Hwcomposer::getInstance().getDrm(); 2468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 2478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 2488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("plane state query failed with error code %d", ret); 2498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return arg.plane.ctx == PSB_DC_PLANE_DISABLED; 2538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid AnnRGBPlane::postFlip() 2568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // prevent mUpdateMasks from being reset 2588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // skipping flip may cause flicking 2598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid AnnRGBPlane::setFramebufferTarget(buffer_handle_t handle) 2628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t stride; 2648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t planeAlpha; 2658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 2678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // do not need to update the buffer handle 2698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mCurrentDataBuffer != handle) 2708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mUpdateMasks |= PLANE_BUFFER_CHANGED; 2718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 2728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mUpdateMasks &= ~PLANE_BUFFER_CHANGED; 2738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // if no update then do Not need set data buffer 2758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mUpdateMasks) 2768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 2778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // don't need to map data buffer for primary plane 2798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mType == PLANE_SPRITE) 2808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_SPRITE_PLANE; 2818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 2828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_PRIMARY_PLANE; 2838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = align_to((4 * align_to(mPosition.w, 32)), 64); 2858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 < mPlaneAlpha && mPlaneAlpha < 0xff) { 2878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol planeAlpha = mPlaneAlpha | 0x80000000; 2888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 2898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // disable plane alpha to offload HW 2908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol planeAlpha = 0xff; 2918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // FIXME: use sprite context for sprite plane 2948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.update_mask = SPRITE_UPDATE_ALL; 2958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.index = mIndex; 2968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.pipe = mDevice; 2978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mPanelOrientation == PANEL_ORIENTATION_180) 2998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.linoff = (mPosition.h - 1) * stride + (mPosition.w - 1) * 4; 3008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 3018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.linoff = 0; 3028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.stride = stride; 3048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.tileoff = 0; 3058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.pos = 0; 3068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.size = 3078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ((mPosition.h - 1) & 0xfff) << 16 | ((mPosition.w - 1) & 0xfff); 3088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.surf = 0; 3098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.contalpa = planeAlpha; 3108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr = PixelFormat::PLANE_PIXEL_FORMAT_BGRA8888; 3118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr |= 0x80000000; 3128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // turn off premultipled alpha blending for HWC_BLENDING_COVERAGE 3148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mBlending == HWC_BLENDING_COVERAGE) { 3158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr |= (0x1 << 23); 3168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mPanelOrientation == PANEL_ORIENTATION_180) 3198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr |= (0x1 << 15); 3208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("type = %d, index = %d, cntr = %#x, linoff = %#x, stride = %#x," 3228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol "surf = %#x, pos = %#x, size = %#x, contalpa = %#x", mType, mIndex, 3238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr, 3248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.linoff, 3258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.stride, 3268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.surf, 3278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.pos, 3288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.size, 3298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.sp_ctx.contalpa); 3308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mCurrentDataBuffer = handle; 3328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 3338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel 3358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android 336