16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#ifndef DISPLAYPLANE_H_
176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#define DISPLAYPLANE_H_
186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
19e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li#include <utils/KeyedVector.h>
20e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li#include <BufferMapper.h>
210594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h>
226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiutypedef struct {
27e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    // align with android, using 'int' here
286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int x;
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int y;
306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int w;
316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int h;
326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} PlanePosition;
336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuenum {
356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // support up to 4 overlays
366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    MAX_OVERLAY_COUNT = 4,
3709149b5d023fe6407dc09a6636c4b4d1d189738fJackie Li    MAX_SPRITE_COUNT = 4,
386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
40466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huenum {
41466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu     // in version 1.3, HWC_FRAMEBUFFER_TARGET is defined as 3
42466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu     HWC_FORCE_FRAMEBUFFER = 255,
43466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu};
44466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
45d9045abeda7b707f3c55779989fc77b2197bc38eJackie Liclass ZOrderConfig;
466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuclass DisplayPlane {
486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiupublic:
496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // plane type
506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    enum {
51c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        PLANE_SPRITE = 0,
526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        PLANE_OVERLAY,
536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        PLANE_PRIMARY,
54a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang        PLANE_CURSOR,
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        PLANE_MAX,
566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    };
57e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
58e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    enum {
59da6edc35caf0d7dfff71b8c4c258a93eb1f86992Lei Zhang        // one more than android's back buffer count to allow more space
60da6edc35caf0d7dfff71b8c4c258a93eb1f86992Lei Zhang        // to do map/unmap, as plane reallocation may unmap on-screen layer.
61c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // each plane will cache the latest MIN_DATA_BUFFER_COUNT buffers
62c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // in case that these buffers are still in-using by display device
63c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li        // other buffers will be released on cache invalidation
64da6edc35caf0d7dfff71b8c4c258a93eb1f86992Lei Zhang        MIN_DATA_BUFFER_COUNT = 4,
65e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    };
66e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
67ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Liprotected:
68ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    enum {
69ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        PLANE_POSITION_CHANGED    = 0x00000001UL,
70ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        PLANE_BUFFER_CHANGED      = 0x00000002UL,
71ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        PLANE_SOURCE_CROP_CHANGED = 0x00000004UL,
72ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li        PLANE_TRANSFORM_CHANGED   = 0x00000008UL,
73ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    };
746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiupublic:
756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    DisplayPlane(int index, int type, int disp);
766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual ~DisplayPlane();
776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiupublic:
786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual int getIndex() const { return mIndex; }
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual int getType() const { return mType; }
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool initCheck() const { return mInitialized; }
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // data destination
836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual void setPosition(int x, int y, int w, int h);
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual void setSourceCrop(int x, int y, int w, int h);
856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual void setTransform(int transform);
8610e89b1bb0d08ad3d037691125908641a914b58elychenx    virtual void setPlaneAlpha(uint8_t alpha, uint32_t blending);
876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // data source
896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool setDataBuffer(uint32_t handle);
90c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual void invalidateBufferCache();
926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // display device
946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool assignToDevice(int disp);
956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // hardware operations
97e2ad4c047651d4442f6a0e002290016d45e9201afu jin    virtual bool flip(void *ctx);
9893d8b1eff292888eeb8bf47299a766185a4fc8b0Andy Qiu    virtual void postFlip();
994a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li
100c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    virtual bool reset();
1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool enable() = 0;
1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool disable() = 0;
10368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang    virtual bool isDisabled() = 0;
1046a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // set z order config
106d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li    virtual void setZOrderConfig(ZOrderConfig& config,
107d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li                                     void *nativeConfig) = 0;
108d191dc7a785f312ede10d711720d8ca32a71b44cJackie Li
109d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    virtual void setZOrder(int zorder);
110d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    virtual int getZOrder() const;
1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual void* getContext() const = 0;
1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
114e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    virtual bool initialize(uint32_t bufferCount);
115e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    virtual void deinitialize();
116e2ad4c047651d4442f6a0e002290016d45e9201afu jin
1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuprotected:
1184a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    virtual void checkPosition(int& x, int& y, int& w, int& h);
1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual bool setDataBuffer(BufferMapper& mapper) = 0;
120e2ad4c047651d4442f6a0e002290016d45e9201afu jinprivate:
121c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    inline BufferMapper* mapBuffer(DataBuffer *buffer);
122e2ad4c047651d4442f6a0e002290016d45e9201afu jin
123c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    inline bool isActiveBuffer(BufferMapper *mapper);
124c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    void updateActiveBuffers(BufferMapper *mapper);
125c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    void invalidateActiveBuffers();
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuprotected:
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int mIndex;
1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int mType;
129d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    int mZOrder;
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int mDevice;
1316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool mInitialized;
132c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
133c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    // cached data buffers
134e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    KeyedVector<uint64_t, BufferMapper*> mDataBuffers;
135e2ad4c047651d4442f6a0e002290016d45e9201afu jin    // holding the most recent buffers
136c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    Vector<BufferMapper*> mActiveBuffers;
137569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li    int mCacheCapacity;
138c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    PlanePosition mPosition;
1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    crop_t mSrcCrop;
14125caf44022e04f4dc131e51b85b2fb8f966d57e7Andy Qiu    bool mIsProtectedBuffer;
1426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int mTransform;
1430fd589de3567b56cc3645ce014d5ad84d12fcb8eLei Zhang    uint8_t mPlaneAlpha;
14410e89b1bb0d08ad3d037691125908641a914b58elychenx    uint32_t mBlending;
1454a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li    uint32_t mCurrentDataBuffer;
146ae31aa8b60bedde362c43f3e040138ff6bfe77ccJackie Li    uint32_t mUpdateMasks;
147ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    drmModeModeInfo mModeInfo;
148ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley    int mPanelOrientation;
149af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu
150af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiuprotected:
151af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    bool mForceScaling;
152af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    uint32_t mDisplayWidth;
153af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    uint32_t mDisplayHeight;
154af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    crop_t mDisplayCrop;
155af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    uint32_t mScalingSource;
156af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    uint32_t mScalingTarget;
157af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu
1586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#endif /* DISPLAYPLANE_H_ */
164