154 lines
4.2 KiB
C++
154 lines
4.2 KiB
C++
/*
|
||
// 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 DISPLAYPLANE_H_
|
||
#define DISPLAYPLANE_H_
|
||
|
||
#include <utils/KeyedVector.h>
|
||
#include <BufferMapper.h>
|
||
#include <Drm.h>
|
||
|
||
namespace android {
|
||
namespace intel {
|
||
|
||
typedef struct {
|
||
// align with android, using 'int' here
|
||
int x;
|
||
int y;
|
||
int w;
|
||
int h;
|
||
} PlanePosition;
|
||
|
||
enum {
|
||
// support up to 4 overlays
|
||
MAX_OVERLAY_COUNT = 4,
|
||
MAX_SPRITE_COUNT = 4,
|
||
};
|
||
|
||
enum {
|
||
// in version 1.3, HWC_FRAMEBUFFER_TARGET is defined as 3
|
||
HWC_FORCE_FRAMEBUFFER = 255,
|
||
};
|
||
|
||
class ZOrderConfig;
|
||
|
||
class DisplayPlane {
|
||
public:
|
||
// plane type
|
||
enum {
|
||
PLANE_SPRITE = 0,
|
||
PLANE_OVERLAY,
|
||
PLANE_PRIMARY,
|
||
PLANE_CURSOR,
|
||
PLANE_MAX,
|
||
};
|
||
|
||
enum {
|
||
// one more than android's back buffer count to allow more space
|
||
// to do map/unmap, as plane reallocation may unmap on-screen layer.
|
||
// each plane will cache the latest MIN_DATA_BUFFER_COUNT buffers
|
||
// in case that these buffers are still in-using by display device
|
||
// other buffers will be released on cache invalidation
|
||
MIN_DATA_BUFFER_COUNT = 4,
|
||
};
|
||
|
||
protected:
|
||
enum {
|
||
PLANE_POSITION_CHANGED = 0x00000001UL,
|
||
PLANE_BUFFER_CHANGED = 0x00000002UL,
|
||
PLANE_SOURCE_CROP_CHANGED = 0x00000004UL,
|
||
PLANE_TRANSFORM_CHANGED = 0x00000008UL,
|
||
};
|
||
public:
|
||
DisplayPlane(int index, int type, int disp);
|
||
virtual ~DisplayPlane();
|
||
public:
|
||
virtual int getIndex() const { return mIndex; }
|
||
virtual int getType() const { return mType; }
|
||
virtual bool initCheck() const { return mInitialized; }
|
||
|
||
// data destination
|
||
virtual void setPosition(int x, int y, int w, int h);
|
||
virtual void setSourceCrop(int x, int y, int w, int h);
|
||
virtual void setTransform(int transform);
|
||
virtual void setPlaneAlpha(uint8_t alpha, uint32_t blending);
|
||
|
||
// data source
|
||
virtual bool setDataBuffer(buffer_handle_t handle);
|
||
|
||
virtual void invalidateBufferCache();
|
||
|
||
// display device
|
||
virtual bool assignToDevice(int disp);
|
||
|
||
// hardware operations
|
||
virtual bool flip(void *ctx);
|
||
virtual void postFlip();
|
||
|
||
virtual bool reset();
|
||
virtual bool enable() = 0;
|
||
virtual bool disable() = 0;
|
||
virtual bool isDisabled() = 0;
|
||
|
||
// set z order config
|
||
virtual void setZOrderConfig(ZOrderConfig& config,
|
||
void *nativeConfig) = 0;
|
||
|
||
virtual void setZOrder(int zorder);
|
||
virtual int getZOrder() const;
|
||
|
||
virtual void* getContext() const = 0;
|
||
|
||
virtual bool initialize(uint32_t bufferCount);
|
||
virtual void deinitialize();
|
||
|
||
protected:
|
||
virtual void checkPosition(int& x, int& y, int& w, int& h);
|
||
virtual bool setDataBuffer(BufferMapper& mapper) = 0;
|
||
private:
|
||
inline BufferMapper* mapBuffer(DataBuffer *buffer);
|
||
|
||
inline int findActiveBuffer(BufferMapper *mapper);
|
||
void updateActiveBuffers(BufferMapper *mapper);
|
||
void invalidateActiveBuffers();
|
||
protected:
|
||
int mIndex;
|
||
int mType;
|
||
int mZOrder;
|
||
int mDevice;
|
||
bool mInitialized;
|
||
|
||
// cached data buffers
|
||
KeyedVector<uint64_t, BufferMapper*> mDataBuffers;
|
||
// holding the most recent buffers
|
||
Vector<BufferMapper*> mActiveBuffers;
|
||
int mCacheCapacity;
|
||
|
||
PlanePosition mPosition;
|
||
crop_t mSrcCrop;
|
||
bool mIsProtectedBuffer;
|
||
int mTransform;
|
||
uint8_t mPlaneAlpha;
|
||
uint32_t mBlending;
|
||
buffer_handle_t mCurrentDataBuffer;
|
||
uint32_t mUpdateMasks;
|
||
drmModeModeInfo mModeInfo;
|
||
int mPanelOrientation;
|
||
};
|
||
|
||
} // namespace intel
|
||
} // namespace android
|
||
|
||
#endif /* DISPLAYPLANE_H_ */
|