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 DISPLAYPLANEMANAGER_H_
176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#define DISPLAYPLANEMANAGER_H_
186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/Dump.h>
206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DisplayPlane.h>
210594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/HwcLayer.h>
226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <utils/Vector.h>
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
279d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiustruct ZOrderLayer
289d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu{
299d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    ZOrderLayer() {
309d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu        memset(this, 0, sizeof(ZOrderLayer));
319d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    }
329d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
339d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    inline bool operator<(const ZOrderLayer& rhs) const {
349d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu        return zorder < rhs.zorder;
359d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    }
369d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
379d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    int planeType;
389d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    int zorder;
399d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    DisplayPlane *plane;
409d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    HwcLayer *hwcLayer;
419d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu};
429d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
439d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiuclass ZOrderConfig : public SortedVector<ZOrderLayer*> {
44d9045abeda7b707f3c55779989fc77b2197bc38eJackie Lipublic:
459d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    ZOrderConfig() {}
46f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li
47d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    int do_compare(const void* lhs, const void* rhs) const {
489d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu        const ZOrderLayer *l = *(ZOrderLayer**)lhs;
499d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu        const ZOrderLayer *r = *(ZOrderLayer**)rhs;
50d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
51d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li        // sorted from z order 0 to n
529d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu        return l->zorder - r->zorder;
53d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li    }
54d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li};
55d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li
569d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuclass DisplayPlaneManager {
586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiupublic:
596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    DisplayPlaneManager();
606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual ~DisplayPlaneManager();
616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
629d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiupublic:
63e2ad4c047651d4442f6a0e002290016d45e9201afu jin    virtual bool initialize();
64e2ad4c047651d4442f6a0e002290016d45e9201afu jin    virtual void deinitialize();
656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
669d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    virtual bool isValidZOrder(int dsp, ZOrderConfig& config) = 0;
679d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    virtual bool assignPlanes(int dsp, ZOrderConfig& config) = 0;
689d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // TODO: remove this API
699d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    virtual void* getZOrderConfig() const = 0;
709d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    virtual int getFreePlanes(int dsp, int type);
71f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    virtual void reclaimPlane(int dsp, DisplayPlane& plane);
72f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    virtual void disableReclaimedPlanes();
73009ab1d686644a8294b16d97ec1d4fe58879cf89Lei Zhang    virtual bool isOverlayPlanesDisabled();
746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump interface
75f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Li    virtual void dump(Dump& d);
76c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li
77f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Liprotected:
789d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    // plane allocation & free
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int getPlane(uint32_t& mask);
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int getPlane(uint32_t& mask, int index);
819d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    DisplayPlane* getPlane(int type, int index);
829d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    DisplayPlane* getAnyPlane(int type);
836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    void putPlane(int index, uint32_t& mask);
849d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    void putPlane(int dsp, DisplayPlane& plane);
859d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    bool isFreePlane(int type, int index);
866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual DisplayPlane* allocPlane(int index, int type) = 0;
879d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
88f6d5b36e320f093f08855d64fa3d565eacae3c4bJackie Liprotected:
89c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    int mPlaneCount[DisplayPlane::PLANE_MAX];
906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int mTotalPlaneCount;
919d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    int mPrimaryPlaneCount;
929d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    int mSpritePlaneCount;
939d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    int mOverlayPlaneCount;
94a6ca0e98674e3f1b0a7239f6e775cae2f667fe5cLei Zhang    int mCursorPlaneCount;
95e2ad4c047651d4442f6a0e002290016d45e9201afu jin
96c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    Vector<DisplayPlane*> mPlanes[DisplayPlane::PLANE_MAX];
976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // Bitmap of free planes. Bit0 - plane A, bit 1 - plane B, etc.
99c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    uint32_t mFreePlanes[DisplayPlane::PLANE_MAX];
100c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li    uint32_t mReclaimedPlanes[DisplayPlane::PLANE_MAX];
1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool mInitialized;
1039d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu
1049d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiuenum {
1059d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu    DEFAULT_PRIMARY_PLANE_COUNT = 3
1069d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu};
1076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#endif /* DISPLAYPLANEMANAGER_H_ */
113