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