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#ifndef DISPLAYPLANE_H_
178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define DISPLAYPLANE_H_
188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/KeyedVector.h>
208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <BufferMapper.h>
218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Drm.h>
228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android {
248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel {
258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujoltypedef struct {
278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // align with android, using 'int' here
288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int x;
298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int y;
308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int w;
318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int h;
328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} PlanePosition;
338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolenum {
358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // support up to 4 overlays
368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    MAX_OVERLAY_COUNT = 4,
378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    MAX_SPRITE_COUNT = 4,
388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol};
398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolenum {
418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol     // in version 1.3, HWC_FRAMEBUFFER_TARGET is defined as 3
428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol     HWC_FORCE_FRAMEBUFFER = 255,
438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol};
448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolclass ZOrderConfig;
468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolclass DisplayPlane {
488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // plane type
508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum {
518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_SPRITE = 0,
528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_OVERLAY,
538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_PRIMARY,
548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_CURSOR,
558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_MAX,
568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum {
598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // one more than android's back buffer count to allow more space
608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // to do map/unmap, as plane reallocation may unmap on-screen layer.
618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // each plane will cache the latest MIN_DATA_BUFFER_COUNT buffers
628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // in case that these buffers are still in-using by display device
638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // other buffers will be released on cache invalidation
648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        MIN_DATA_BUFFER_COUNT = 4,
658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprotected:
688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum {
698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_POSITION_CHANGED    = 0x00000001UL,
708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_BUFFER_CHANGED      = 0x00000002UL,
718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_SOURCE_CROP_CHANGED = 0x00000004UL,
728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PLANE_TRANSFORM_CHANGED   = 0x00000008UL,
738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    DisplayPlane(int index, int type, int disp);
768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual ~DisplayPlane();
778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual int getIndex() const { return mIndex; }
798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual int getType() const { return mType; }
808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool initCheck() const { return mInitialized; }
818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // data destination
838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setPosition(int x, int y, int w, int h);
848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setSourceCrop(int x, int y, int w, int h);
858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setTransform(int transform);
868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setPlaneAlpha(uint8_t alpha, uint32_t blending);
878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // data source
898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool setDataBuffer(buffer_handle_t handle);
908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void invalidateBufferCache();
928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // display device
948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool assignToDevice(int disp);
958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // hardware operations
978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool flip(void *ctx);
988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void postFlip();
998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool reset();
1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool enable() = 0;
1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool disable() = 0;
1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool isDisabled() = 0;
1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // set z order config
1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setZOrderConfig(ZOrderConfig& config,
1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                     void *nativeConfig) = 0;
1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void setZOrder(int zorder);
1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual int getZOrder() const;
1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void* getContext() const = 0;
1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool initialize(uint32_t bufferCount);
1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void deinitialize();
1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprotected:
1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void checkPosition(int& x, int& y, int& w, int& h);
1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool setDataBuffer(BufferMapper& mapper) = 0;
1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline BufferMapper* mapBuffer(DataBuffer *buffer);
1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline int findActiveBuffer(BufferMapper *mapper);
1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void updateActiveBuffers(BufferMapper *mapper);
1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void invalidateActiveBuffers();
1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprotected:
1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mIndex;
1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mType;
1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mZOrder;
1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mDevice;
1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mInitialized;
1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // cached data buffers
1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    KeyedVector<uint64_t, BufferMapper*> mDataBuffers;
1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // holding the most recent buffers
1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Vector<BufferMapper*> mActiveBuffers;
1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mCacheCapacity;
1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    PlanePosition mPosition;
1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    crop_t mSrcCrop;
1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mIsProtectedBuffer;
1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mTransform;
1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    uint8_t mPlaneAlpha;
1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    uint32_t mBlending;
1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    buffer_handle_t mCurrentDataBuffer;
1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    uint32_t mUpdateMasks;
1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    drmModeModeInfo mModeInfo;
1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mPanelOrientation;
1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol};
1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel
1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android
1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif /* DISPLAYPLANE_H_ */
155