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 <hal_public.h>
21#include <DisplayPlane.h>
22#include <BufferMapper.h>
23#include <common/Wsbm.h>
24#include <common/OverlayHardware.h>
25#include <common/VideoPayloadBuffer.h>
26
27namespace android {
28namespace intel {
29
30typedef struct {
31    OverlayBackBufferBlk *buf;
32    uint32_t gttOffsetInPage;
33    void* bufObject;
34} OverlayBackBuffer;
35
36class OverlayPlaneBase : public DisplayPlane {
37public:
38    OverlayPlaneBase(int index, int disp);
39    virtual ~OverlayPlaneBase();
40
41    virtual void invalidateBufferCache();
42
43    virtual bool assignToDevice(int disp);
44
45    virtual void setZOrderConfig(ZOrderConfig& config, void *nativeConfig);
46
47    // plane operations
48    virtual bool flip(void *ctx) = 0;
49    virtual bool reset();
50    virtual bool enable();
51    virtual bool disable();
52    virtual bool isDisabled();
53
54    virtual void* getContext() const = 0;
55    virtual bool initialize(uint32_t bufferCount);
56    virtual void deinitialize();
57
58protected:
59    // generic overlay register flush
60    virtual bool flush(uint32_t flags) = 0;
61    virtual bool setDataBuffer(BufferMapper& mapper);
62    virtual bool bufferOffsetSetup(BufferMapper& mapper);
63    virtual uint32_t calculateSWidthSW(uint32_t offset, uint32_t width);
64    virtual bool coordinateSetup(BufferMapper& mapper);
65    virtual bool setCoeffRegs(double *coeff, int mantSize,
66                                 coeffPtr pCoeff, int pos);
67    virtual void updateCoeff(int taps, double fCutoff,
68                                bool isHoriz, bool isY,
69                                coeffPtr pCoeff);
70    virtual bool scalingSetup(BufferMapper& mapper);
71    virtual bool colorSetup(BufferMapper& mapper);
72    virtual void checkPosition(int& x, int& y, int& w, int& h);
73    virtual void checkCrop(int& x, int& y, int& w, int& h, int coded_width, int coded_height);
74
75
76protected:
77    // back buffer operations
78    virtual OverlayBackBuffer* createBackBuffer();
79    virtual void deleteBackBuffer(int buf);
80    virtual void resetBackBuffer(int buf);
81
82    virtual BufferMapper* getTTMMapper(BufferMapper& grallocMapper, struct VideoPayloadBuffer *payload);
83    virtual void  putTTMMapper(BufferMapper* mapper);
84    virtual bool rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper);
85    virtual bool useOverlayRotation(BufferMapper& mapper);
86    virtual bool scaledBufferReady(BufferMapper& mapper, BufferMapper* &scaledMapper, VideoPayloadBuffer *payload);
87
88private:
89    inline bool isActiveTTMBuffer(BufferMapper *mapper);
90    void updateActiveTTMBuffers(BufferMapper *mapper);
91    void invalidateActiveTTMBuffers();
92    void invalidateTTMBuffers();
93
94protected:
95    // flush flags
96    enum {
97        PLANE_ENABLE     = 0x00000001UL,
98        PLANE_DISABLE    = 0x00000002UL,
99        UPDATE_COEF      = 0x00000004UL,
100    };
101
102    enum {
103        OVERLAY_BACK_BUFFER_COUNT = 3,
104        MAX_ACTIVE_TTM_BUFFERS = 3,
105        OVERLAY_DATA_BUFFER_COUNT = 20,
106    };
107
108    // TTM data buffers
109    KeyedVector<buffer_handle_t, BufferMapper*> mTTMBuffers;
110    // latest TTM buffers
111    Vector<BufferMapper*> mActiveTTMBuffers;
112
113    // overlay back buffer
114    OverlayBackBuffer *mBackBuffer[OVERLAY_BACK_BUFFER_COUNT];
115    int mCurrent;
116    // wsbm
117    Wsbm *mWsbm;
118    // pipe config
119    uint32_t mPipeConfig;
120
121    int mBobDeinterlace;
122    int mUseScaledBuffer;
123};
124
125} // namespace intel
126} // namespace android
127
128#endif /* OVERLAY_PLANE_BASE_H */
129
130