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