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 HWC_LAYER_LIST_H
178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define HWC_LAYER_LIST_H
188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Dump.h>
208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <hardware/hwcomposer.h>
218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/SortedVector.h>
228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <DataBuffer.h>
238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <DisplayPlane.h>
248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <DisplayPlaneManager.h>
258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcLayer.h>
268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android {
288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel {
298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolclass HwcLayerList {
328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    HwcLayerList(hwc_display_contents_1_t *list, int disp);
348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual ~HwcLayerList();
358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool initialize();
388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void deinitialize();
398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual bool update(hwc_display_contents_1_t *list);
418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual DisplayPlane* getPlane(uint32_t index) const;
428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postFlip();
448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // dump interface
468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual void dump(Dump& d);
478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool checkSupported(int planeType, HwcLayer *hwcLayer);
508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool checkCursorSupported(HwcLayer *hwcLayer);
518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool allocatePlanes();
528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignCursorPlanes();
538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignCursorPlanes(int index, int planeNumber);
548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignOverlayPlanes();
558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignOverlayPlanes(int index, int planeNumber);
568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignSpritePlanes();
578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignSpritePlanes(int index, int planeNumber);
588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignPrimaryPlane();
598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool assignPrimaryPlaneHelper(HwcLayer *hwcLayer, int zorder = -1);
608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool attachPlanes();
618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool useAsFrameBufferTarget(HwcLayer *target);
628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool hasIntersection(HwcLayer *la, HwcLayer *lb);
638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void addStaticLayerSize(HwcLayer *hwcLayer);
648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool checkStaticLayerSize();
658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ZOrderLayer* addZOrderLayer(int type, HwcLayer *hwcLayer, int zorder = -1);
668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void removeZOrderLayer(ZOrderLayer *layer);
678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void setupSmartComposition();
688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool setupSmartComposition2();
698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void dump();
708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    class HwcLayerVector : public SortedVector<HwcLayer*> {
738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    public:
748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        HwcLayerVector() {}
758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        virtual int do_compare(const void* lhs, const void* rhs) const {
768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            const HwcLayer* l = *(HwcLayer**)lhs;
778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            const HwcLayer* r = *(HwcLayer**)rhs;
788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            // sorted from index 0 to n
798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            return l->getIndex() - r->getIndex();
808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    class PriorityVector : public SortedVector<HwcLayer*> {
848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    public:
858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        PriorityVector() {}
868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        virtual int do_compare(const void* lhs, const void* rhs) const {
878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            const HwcLayer* l = *(HwcLayer**)lhs;
888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            const HwcLayer* r = *(HwcLayer**)rhs;
898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            return r->getPriority() - l->getPriority();
908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    hwc_display_contents_1_t *mList;
948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mLayerCount;
958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    HwcLayerVector mLayers;
978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    HwcLayerVector mFBLayers;
988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Vector<int> mStaticLayersIndex;
998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    PriorityVector mSpriteCandidates;
1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    PriorityVector mOverlayCandidates;
1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    PriorityVector mCursorCandidates;
1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ZOrderConfig mZOrderConfig;
1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    HwcLayer *mFrameBufferTarget;
1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mDisplayIndex;
1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mLayerSize;
1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol};
1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel
1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android
1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif /* HWC_LAYER_LIST_H */
113