Home | History | Annotate | Download | only in anniedale
      1 /*
      2 // Copyright(c)2014 IntelCorporation
      3 //
      4 // LicensedundertheApacheLicense,Version2.0(the"License");
      5 // youmaynotusethisfileexceptincompliancewiththeLicense.
      6 // YoumayobtainacopyoftheLicenseat
      7 //
      8 // http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unlessrequiredbyapplicablelaworagreedtoinwriting,software
     11 // distributedundertheLicenseisdistributedonan"ASIS"BASIS,
     12 // WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
     13 // SeetheLicenseforthespecificlanguagegoverningpermissionsand
     14 // limitationsundertheLicense.
     15 */
     16 
     17 #include <HwcTrace.h>
     18 #include <Hwcomposer.h>
     19 #include <BufferManager.h>
     20 #include <anniedale/AnnCursorPlane.h>
     21 #include <tangier/TngGrallocBuffer.h>
     22 #include <hal_public.h>
     23 
     24 namespace android {
     25 namespace intel {
     26 
     27 AnnCursorPlane::AnnCursorPlane(int index, int disp)
     28     : DisplayPlane(index, PLANE_CURSOR, disp)
     29 {
     30     CTRACE();
     31     memset(&mContext, 0, sizeof(mContext));
     32     memset(&mCrop, 0, sizeof(mCrop));
     33 }
     34 
     35 AnnCursorPlane::~AnnCursorPlane()
     36 {
     37     CTRACE();
     38 }
     39 
     40 bool AnnCursorPlane::enable()
     41 {
     42     return enablePlane(true);
     43 
     44 }
     45 
     46 bool AnnCursorPlane::disable()
     47 {
     48     return enablePlane(false);
     49 }
     50 
     51 bool AnnCursorPlane::reset()
     52 {
     53     // clear mCrop once reset
     54     memset(&mCrop, 0, sizeof(mCrop));
     55     return true;
     56 }
     57 
     58 void* AnnCursorPlane::getContext() const
     59 {
     60     CTRACE();
     61     return (void *)&mContext;
     62 }
     63 
     64 void AnnCursorPlane::setZOrderConfig(ZOrderConfig& config, void *nativeConfig)
     65 {
     66     (void) config;
     67     (void) nativeConfig;
     68 
     69     CTRACE();
     70 }
     71 
     72 bool AnnCursorPlane::setDataBuffer(buffer_handle_t handle)
     73 {
     74     bool ret;
     75 
     76     if (!handle) {
     77         ETRACE("handle is NULL");
     78         return false;
     79     }
     80 
     81     ret = DisplayPlane::setDataBuffer(handle);
     82     if (ret == false) {
     83         ETRACE("failed to set data buffer");
     84         return ret;
     85     }
     86 
     87     return true;
     88 }
     89 
     90 bool AnnCursorPlane::setDataBuffer(BufferMapper& mapper)
     91 {
     92     int w = mapper.getWidth();
     93     int h = mapper.getHeight();
     94     int cursorSize = 0;
     95 
     96     CTRACE();
     97 
     98     // setup plane position
     99     int dstX = mPosition.x;
    100     int dstY = mPosition.y;
    101 
    102     if (h < w) {
    103         cursorSize = h;
    104     } else {
    105         cursorSize = w;
    106     }
    107 
    108     uint32_t cntr = 0;
    109     if (64 <= cursorSize && cursorSize < 128) {
    110         cursorSize = 64;
    111         cntr = 0x7;
    112     } else if (128 <= cursorSize && cursorSize < 256) {
    113         cursorSize = 128;
    114         cntr = 0x2;
    115     } else {
    116         cursorSize = 256;
    117         cntr = 0x3;
    118     }
    119 
    120     if (mapper.getFormat() == HAL_PIXEL_FORMAT_RGBA_8888) {
    121         cntr |= 1 << 5;
    122     } else if (mapper.getFormat() == HAL_PIXEL_FORMAT_BGRA_8888) {
    123         // swap color from BGRA to RGBA - alpha is MSB
    124         uint8_t *p = (uint8_t *)(mapper.getCpuAddress(0));
    125         uint8_t *srcPixel;
    126         uint32_t stride = mapper.getStride().rgb.stride;
    127         uint8_t temp;
    128         if (!p) {
    129             return false;
    130         }
    131 
    132         for (int i = 0; i < cursorSize; i++) {
    133             for (int j = 0; j < cursorSize; j++) {
    134                 srcPixel = p + i*stride + j*4;
    135                 temp = srcPixel[0];
    136                 srcPixel[0] = srcPixel[2];
    137                 srcPixel[2] = temp;
    138             }
    139         }
    140         cntr |= 1 << 5;
    141     } else {
    142         ETRACE("invalid color format");
    143         return false;
    144     }
    145 
    146     // update context
    147     mContext.type = DC_CURSOR_PLANE;
    148     mContext.ctx.cs_ctx.index = mIndex;
    149     mContext.ctx.cs_ctx.pipe = mDevice;
    150     mContext.ctx.cs_ctx.cntr = cntr;
    151     mContext.ctx.cs_ctx.surf = mapper.getGttOffsetInPage(0) << 12;
    152 
    153     mContext.ctx.cs_ctx.pos = 0;
    154     if (dstX < 0) {
    155         mContext.ctx.cs_ctx.pos |= 1 << 15;
    156         dstX = -dstX;
    157     }
    158     if (dstY < 0) {
    159         mContext.ctx.cs_ctx.pos |= 1 << 31;
    160         dstY = -dstY;
    161     }
    162     mContext.ctx.cs_ctx.pos |= (dstY & 0xfff) << 16 | (dstX & 0xfff);
    163     return true;
    164 }
    165 
    166 bool AnnCursorPlane::enablePlane(bool enabled)
    167 {
    168     RETURN_FALSE_IF_NOT_INIT();
    169 
    170     struct drm_psb_register_rw_arg arg;
    171     memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    172     if (enabled) {
    173         arg.plane_enable_mask = 1;
    174     } else {
    175         arg.plane_disable_mask = 1;
    176     }
    177 
    178     arg.plane.type = DC_CURSOR_PLANE;
    179     arg.plane.index = mIndex;
    180     arg.plane.ctx = 0;
    181 
    182     // issue ioctl
    183     Drm *drm = Hwcomposer::getInstance().getDrm();
    184     bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
    185     if (ret == false) {
    186         WTRACE("plane enabling (%d) failed with error code %d", enabled, ret);
    187         return false;
    188     }
    189 
    190     return true;
    191 }
    192 
    193 bool AnnCursorPlane::isDisabled()
    194 {
    195     RETURN_FALSE_IF_NOT_INIT();
    196 
    197     struct drm_psb_register_rw_arg arg;
    198     memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    199 
    200     arg.plane.type = DC_CURSOR_PLANE;
    201     arg.get_plane_state_mask = 1;
    202     arg.plane.index = mIndex;
    203     arg.plane.ctx = 0;
    204 
    205     // issue ioctl
    206     Drm *drm = Hwcomposer::getInstance().getDrm();
    207     bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
    208     if (ret == false) {
    209         WTRACE("plane state query failed with error code %d", ret);
    210         return false;
    211     }
    212 
    213     return arg.plane.ctx == PSB_DC_PLANE_DISABLED;
    214 }
    215 
    216 void AnnCursorPlane::postFlip()
    217 {
    218     // prevent mUpdateMasks from being reset
    219     // skipping flip may cause flicking
    220 }
    221 
    222 } // namespace intel
    223 } // namespace android
    224