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