C++程序  |  155行  |  4.16 KB

/*
// 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_ */