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 <math.h> 178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h> 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Drm.h> 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Hwcomposer.h> 208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <tangier/TngOverlayPlane.h> 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <tangier/TngGrallocBuffer.h> 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolTngOverlayPlane::TngOverlayPlane(int index, int disp) 278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol : OverlayPlaneBase(index, disp), 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotationBufProvider(NULL) 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&mContext, 0, sizeof(mContext)); 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolTngOverlayPlane::~TngOverlayPlane() 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::flip(void *ctx) 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_FALSE_IF_NOT_INIT(); 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!DisplayPlane::flip(ctx)) 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.type = DC_OVERLAY_PLANE; 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.ovadd = 0x0; 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.ovadd = (mBackBuffer[mCurrent]->gttOffsetInPage << 12); 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.index = mIndex; 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.pipe = mDevice; 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.ovadd |= mPipeConfig; 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.ovadd |= 0x1; 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // move to next back buffer 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol //mCurrent = (mCurrent + 1) % OVERLAY_BACK_BUFFER_COUNT; 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("ovadd = %#x, index = %d, device = %d", 598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.ctx.ov_ctx.ovadd, 608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mIndex, 618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDevice); 628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::reset() 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol OverlayPlaneBase::reset(); 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mRotationBufProvider) 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotationBufProvider->reset(); 718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid* TngOverlayPlane::getContext() const 758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return (void *)&mContext; 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::setDataBuffer(BufferMapper& mapper) 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (OverlayPlaneBase::setDataBuffer(mapper) == false) { 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mIsProtectedBuffer) { 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // Bit 0: Decryption request, only allowed to change on a synchronous flip 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // This request will be qualified with the separate decryption enable bit for OV 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBackBuffer[mCurrent]->buf->OSTART_0Y |= 0x1; 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBackBuffer[mCurrent]->buf->OSTART_1Y |= 0x1; 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mContext.gtt_key = (uint64_t)mapper.getCpuAddress(0); 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::initialize(uint32_t bufferCount) 988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!OverlayPlaneBase::initialize(bufferCount)) { 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to initialize OverlayPlaneBase"); 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setup rotation buffer 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotationBufProvider = new RotationBufferProvider(mWsbm); 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mRotationBufProvider || !mRotationBufProvider->initialize()) { 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DEINIT_AND_RETURN_FALSE("failed to initialize RotationBufferProvider"); 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid TngOverlayPlane::deinitialize() 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DEINIT_AND_DELETE_OBJ(mRotationBufProvider); 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol OverlayPlaneBase::deinitialize(); 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper) 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct VideoPayloadBuffer *payload; 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VideoPayloadBuffer buffer_info; 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t format; 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // only NV12_VED has rotated buffer 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol format = mapper.getFormat(); 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled && 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol format != HAL_PIXEL_FORMAT_NV12) { 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("Invalid video format %#x", format); 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload == NULL && format == HAL_PIXEL_FORMAT_NV12) { 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // need to populate buffer_info 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void *p = mapper.getCpuAddress(SUB_BUFFER0); 1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!p) { 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to get buffer user pointer"); 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = mRotationBufProvider->prepareBufferInfo(mapper.getWidth(), 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper.getHeight(), 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper.getStride().yuv.yStride, 1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &buffer_info, p); 1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to prepare buffer info"); 1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload = &buffer_info; 1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // check payload 1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!payload) { 1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("no payload found"); 1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload->force_output_method == FORCE_OUTPUT_GPU) { 1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("Output method is not supported!"); 1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload->client_transform != mTransform || 1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBobDeinterlace) { 1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->hwc_timestamp = systemTime(); 1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->layer_transform = mTransform; 1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mRotationBufProvider->setupRotationBuffer(payload, mTransform)) { 1708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to setup rotation buffer"); 1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol rotatedMapper = getTTMMapper(mapper, payload); 1768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 1788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool TngOverlayPlane::flush(uint32_t flags) 1818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_FALSE_IF_NOT_INIT(); 1838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ATRACE("flags = %#x, type = %d, index = %d", flags, mType, mIndex); 1848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!(flags & PLANE_ENABLE) && !(flags & PLANE_DISABLE)) 1868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct drm_psb_register_rw_arg arg; 1898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 1908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (flags & PLANE_DISABLE) 1928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_disable_mask = 1; 1938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else if (flags & PLANE_ENABLE) 1948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane_enable_mask = 1; 1958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.type = DC_OVERLAY_PLANE; 1978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.index = mIndex; 1988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.ctx = (mBackBuffer[mCurrent]->gttOffsetInPage << 12); 1998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // pipe select 2008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol arg.plane.ctx |= mPipeConfig; 2018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (flags & PLANE_DISABLE) { 2038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DTRACE("disabling overlay %d on device %d", mIndex, mDevice); 2048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // issue ioctl 2078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Drm *drm = Hwcomposer::getInstance().getDrm(); 2088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 2098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 2108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("overlay update failed with error code %d", ret); 2118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 2158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel 2188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android 219