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 <Drm.h> 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <tangier/TngPrimaryPlane.h> 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <tangier/TngGrallocBuffer.h> 208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <common/PixelFormat.h> 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolTngPrimaryPlane::TngPrimaryPlane(int index, int disp) 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol : TngSpritePlane(index, disp) 278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mType = PLANE_PRIMARY; 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mForceBottom = true; 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mAbovePrimary = false; 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolTngPrimaryPlane::~TngPrimaryPlane() 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid TngPrimaryPlane::setFramebufferTarget(buffer_handle_t handle) 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // do not need to update the buffer handle 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mCurrentDataBuffer != handle) 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mUpdateMasks |= PLANE_BUFFER_CHANGED; 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mUpdateMasks &= ~PLANE_BUFFER_CHANGED; 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // if no update then do Not need set data buffer 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mUpdateMasks) 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // don't need to map data buffer for primary plane 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_PRIMARY_PLANE; 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.update_mask = SPRITE_UPDATE_ALL; 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.index = mIndex; 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.pipe = mDevice; 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.stride = align_to((4 * align_to(mPosition.w, 32)), 64); 59a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#ifdef ENABLE_ROTATION_180 60e7c23207defddebbf46048c6b53446f62083434fVictor Tasayco Loarte mContext.ctx.prim_ctx.linoff = (mPosition.h - 1) * mContext.ctx.prim_ctx.stride + (mPosition.w - 1)* 4; 61a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#else 62a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte mContext.ctx.prim_ctx.linoff = 0; 63a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#endif 648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.pos = 0; 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.size = 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ((mPosition.h - 1) & 0xfff) << 16 | ((mPosition.w - 1) & 0xfff); 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.surf = 0; 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.contalpa = 0; 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr = PixelFormat::PLANE_PIXEL_FORMAT_BGRA8888; 71a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#ifdef ENABLE_ROTATION_180 72a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte mContext.ctx.prim_ctx.cntr |= 0x80008000; 73a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#else 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.prim_ctx.cntr |= 0x80000000; 75a130370d8aed35814cb595e35420bd799e9e75faVictor Tasayco Loarte#endif 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mCurrentDataBuffer = handle; 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngPrimaryPlane::enablePlane(bool enabled) 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_FALSE_IF_NOT_INIT(); 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct drm_psb_register_rw_arg arg; 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (enabled) { 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_enable_mask = 1; 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_disable_mask = 1; 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_PRIMARY_PLANE; 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.index = mIndex; 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.ctx = 0; 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // issue ioctl 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Drm *drm = Hwcomposer::getInstance().getDrm(); 968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("primary enabling (%d) failed with error code %d", enabled, ret); 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngPrimaryPlane::setDataBuffer(buffer_handle_t handle) 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!handle) { 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol setFramebufferTarget(handle); 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol TngGrallocBuffer tmpBuf(handle); 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t usage; 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret; 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ATRACE("handle = %#x", handle); 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol usage = tmpBuf.getUsage(); 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (GRALLOC_USAGE_HW_FB & usage) { 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol setFramebufferTarget(handle); 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // use primary as a sprite 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = DisplayPlane::setDataBuffer(handle); 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to set data buffer"); 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return ret; 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_PRIMARY_PLANE; 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid TngPrimaryPlane::setZOrderConfig(ZOrderConfig& zorderConfig, 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void *nativeConfig) 1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!nativeConfig) { 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("Invalid parameter, no native config"); 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mForceBottom = false; 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int primaryIndex = -1; 1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int overlayIndex = -1; 1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // only consider force bottom when overlay is active 1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (size_t i = 0; i < zorderConfig.size(); i++) { 1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DisplayPlane *plane = zorderConfig[i]->plane; 1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (plane->getType() == DisplayPlane::PLANE_PRIMARY) 1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol primaryIndex = i; 1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (plane->getType() == DisplayPlane::PLANE_OVERLAY) { 1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol overlayIndex = i; 1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // if has overlay plane which is below primary plane 1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (overlayIndex > primaryIndex) { 1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mForceBottom = true; 1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct intel_dc_plane_zorder *zorder = 1648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol (struct intel_dc_plane_zorder *)nativeConfig; 1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol zorder->forceBottom[mIndex] = mForceBottom ? 1 : 0; 1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngPrimaryPlane::assignToDevice(int disp) 1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 170a174f45487c170ca5e229ed0b8423cccd4819264Victor Tasayco Loarte DisplayPlane::assignToDevice(disp); 1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel 1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android 176