/*
// Copyright (c) 2014 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#ifndef HWC_LAYER_LIST_H
#define HWC_LAYER_LIST_H
#include <Dump.h>
#include <hardware/hwcomposer.h>
#include <utils/SortedVector.h>
#include <DataBuffer.h>
#include <DisplayPlane.h>
#include <DisplayPlaneManager.h>
#include <HwcLayer.h>
namespace android {
namespace intel {
class HwcLayerList {
public:
HwcLayerList(hwc_display_contents_1_t *list, int disp);
virtual ~HwcLayerList();
public:
virtual bool initialize();
virtual void deinitialize();
virtual bool update(hwc_display_contents_1_t *list);
virtual DisplayPlane* getPlane(uint32_t index) const;
void postFlip();
// dump interface
virtual void dump(Dump& d);
private:
bool checkSupported(int planeType, HwcLayer *hwcLayer);
bool checkCursorSupported(HwcLayer *hwcLayer);
bool allocatePlanes();
bool assignCursorPlanes();
bool assignCursorPlanes(int index, int planeNumber);
bool assignOverlayPlanes();
bool assignOverlayPlanes(int index, int planeNumber);
bool assignSpritePlanes();
bool assignSpritePlanes(int index, int planeNumber);
bool assignPrimaryPlane();
bool assignPrimaryPlaneHelper(HwcLayer *hwcLayer, int zorder = -1);
bool attachPlanes();
bool useAsFrameBufferTarget(HwcLayer *target);
bool hasIntersection(HwcLayer *la, HwcLayer *lb);
void addStaticLayerSize(HwcLayer *hwcLayer);
bool checkStaticLayerSize();
ZOrderLayer* addZOrderLayer(int type, HwcLayer *hwcLayer, int zorder = -1);
void removeZOrderLayer(ZOrderLayer *layer);
void setupSmartComposition();
bool setupSmartComposition2();
void dump();
private:
class HwcLayerVector : public SortedVector<HwcLayer*> {
public:
HwcLayerVector() {}
virtual int do_compare(const void* lhs, const void* rhs) const {
const HwcLayer* l = *(HwcLayer**)lhs;
const HwcLayer* r = *(HwcLayer**)rhs;
// sorted from index 0 to n
return l->getIndex() - r->getIndex();
}
};
class PriorityVector : public SortedVector<HwcLayer*> {
public:
PriorityVector() {}
virtual int do_compare(const void* lhs, const void* rhs) const {
const HwcLayer* l = *(HwcLayer**)lhs;
const HwcLayer* r = *(HwcLayer**)rhs;
return r->getPriority() - l->getPriority();
}
};
hwc_display_contents_1_t *mList;
int mLayerCount;
HwcLayerVector mLayers;
HwcLayerVector mFBLayers;
Vector<int> mStaticLayersIndex;
PriorityVector mSpriteCandidates;
PriorityVector mOverlayCandidates;
PriorityVector mCursorCandidates;
ZOrderConfig mZOrderConfig;
HwcLayer *mFrameBufferTarget;
int mDisplayIndex;
int mLayerSize;
};
} // namespace intel
} // namespace android
#endif /* HWC_LAYER_LIST_H */