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