1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#ifndef OVERLAY_PLANE_BASE_H
17#define OVERLAY_PLANE_BASE_H
18
19#include <utils/KeyedVector.h>
20#include <DisplayPlane.h>
21#include <BufferMapper.h>
22#include <ips/common/Wsbm.h>
23#include <ips/common/OverlayHardware.h>
24#include <ips/common/VideoPayloadBuffer.h>
25
26namespace android {
27namespace intel {
28
29typedef struct {
30    OverlayBackBufferBlk *buf;
31    uint32_t gttOffsetInPage;
32    uint32_t bufObject;
33} OverlayBackBuffer;
34
35class OverlayPlaneBase : public DisplayPlane {
36public:
37    OverlayPlaneBase(int index, int disp);
38    virtual ~OverlayPlaneBase();
39
40    virtual void invalidateBufferCache();
41
42    virtual bool assignToDevice(int disp);
43
44    virtual void setZOrderConfig(ZOrderConfig& config, void *nativeConfig);
45
46    // plane operations
47    virtual bool flip(void *ctx) = 0;
48    virtual bool reset();
49    virtual bool enable();
50    virtual bool disable();
51    virtual bool isDisabled();
52
53    virtual void* getContext() const = 0;
54    virtual bool initialize(uint32_t bufferCount);
55    virtual void deinitialize();
56
57protected:
58    // generic overlay register flush
59    virtual bool flush(uint32_t flags) = 0;
60    virtual bool setDataBuffer(BufferMapper& mapper);
61    virtual bool bufferOffsetSetup(BufferMapper& mapper);
62    virtual uint32_t calculateSWidthSW(uint32_t offset, uint32_t width);
63    virtual bool coordinateSetup(BufferMapper& mapper);
64    virtual bool setCoeffRegs(double *coeff, int mantSize,
65                                 coeffPtr pCoeff, int pos);
66    virtual void updateCoeff(int taps, double fCutoff,
67                                bool isHoriz, bool isY,
68                                coeffPtr pCoeff);
69    virtual bool scalingSetup(BufferMapper& mapper);
70    virtual void checkPosition(int& x, int& y, int& w, int& h);
71    virtual void checkCrop(int& x, int& y, int& w, int& h, int coded_width, int coded_height);
72
73
74protected:
75    // back buffer operations
76    virtual OverlayBackBuffer* createBackBuffer();
77    virtual void deleteBackBuffer(int buf);
78    virtual void resetBackBuffer(int buf);
79
80    virtual BufferMapper* getTTMMapper(BufferMapper& grallocMapper, struct VideoPayloadBuffer *payload);
81    virtual void  putTTMMapper(BufferMapper* mapper);
82    virtual bool rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper);
83    virtual bool useOverlayRotation(BufferMapper& mapper);
84
85private:
86    inline bool isActiveTTMBuffer(BufferMapper *mapper);
87    void updateActiveTTMBuffers(BufferMapper *mapper);
88    void invalidateActiveTTMBuffers();
89    void invalidateTTMBuffers();
90
91protected:
92    // flush flags
93    enum {
94        PLANE_ENABLE     = 0x00000001UL,
95        PLANE_DISABLE    = 0x00000002UL,
96        UPDATE_COEF      = 0x00000004UL,
97    };
98
99    enum {
100        OVERLAY_BACK_BUFFER_COUNT = 3,
101        MAX_ACTIVE_TTM_BUFFERS = 3,
102        OVERLAY_DATA_BUFFER_COUNT = 20,
103    };
104
105    // TTM data buffers
106    KeyedVector<uint64_t, BufferMapper*> mTTMBuffers;
107    // latest TTM buffers
108    Vector<BufferMapper*> mActiveTTMBuffers;
109
110    // overlay back buffer
111    OverlayBackBuffer *mBackBuffer[OVERLAY_BACK_BUFFER_COUNT];
112    int mCurrent;
113    // wsbm
114    Wsbm *mWsbm;
115    // pipe config
116    uint32_t mPipeConfig;
117
118    int mBobDeinterlace;
119};
120
121} // namespace intel
122} // namespace android
123
124#endif /* OVERLAY_PLANE_BASE_H */
125
126