hwc_mdpcomp.h revision 513ddc2124abf90c63af41999201f0d2031af0c8
1/*
2 * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Not a Contribution, Apache license notifications and license are retained
5 * for attribution purposes only.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#ifndef HWC_MDP_COMP
21#define HWC_MDP_COMP
22
23#include <hwc_utils.h>
24#include <idle_invalidator.h>
25#include <cutils/properties.h>
26#include <overlay.h>
27
28#define DEFAULT_IDLE_TIME 2000
29#define MAX_PIPES_PER_MIXER 4
30
31namespace overlay {
32class Rotator;
33};
34
35namespace qhwc {
36namespace ovutils = overlay::utils;
37
38class MDPComp {
39public:
40    explicit MDPComp(int);
41    virtual ~MDPComp(){};
42    /*sets up mdp comp for the current frame */
43    int prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
44    /* draw */
45    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
46    /* dumpsys */
47    void dump(android::String8& buf);
48
49    static MDPComp* getObject(const int& width, const int dpy);
50    /* Handler to invoke frame redraw on Idle Timer expiry */
51    static void timeout_handler(void *udata);
52    /* Initialize MDP comp*/
53    static bool init(hwc_context_t *ctx);
54    static void resetIdleFallBack() { sIdleFallBack = false; }
55
56protected:
57    enum ePipeType {
58        MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
59        MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
60        MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
61        MDPCOMP_OV_ANY,
62    };
63
64    /* mdp pipe data */
65    struct MdpPipeInfo {
66        int zOrder;
67        virtual ~MdpPipeInfo(){};
68    };
69
70    /* per layer data */
71    struct PipeLayerPair {
72        MdpPipeInfo *pipeInfo;
73        overlay::Rotator* rot;
74        int listIndex;
75    };
76
77    /* per frame data */
78    struct FrameInfo {
79        /* maps layer list to mdp list */
80        int layerCount;
81        int layerToMDP[MAX_NUM_LAYERS];
82
83        /* maps mdp list to layer list */
84        int mdpCount;
85        struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
86
87        /* layer composing on FB? */
88        int fbCount;
89        bool isFBComposed[MAX_NUM_LAYERS];
90
91        bool needsRedraw;
92        int fbZ;
93
94        /* c'tor */
95        FrameInfo();
96        /* clear old frame data */
97        void reset(const int& numLayers);
98        void map();
99    };
100
101    /* cached data */
102    struct LayerCache {
103        int layerCount;
104        int mdpCount;
105        int cacheCount;
106        int fbZ;
107        buffer_handle_t hnd[MAX_NUM_LAYERS];
108
109        /* c'tor */
110        LayerCache();
111        /* clear caching info*/
112        void reset();
113        void cacheAll(hwc_display_contents_1_t* list);
114        void updateCounts(const FrameInfo&);
115    };
116
117    /* No of pipes needed for Framebuffer */
118    virtual int pipesForFB() = 0;
119    /* calculates pipes needed for the panel */
120    virtual int pipesNeeded(hwc_context_t *ctx,
121                            hwc_display_contents_1_t* list) = 0;
122    /* allocates pipe from pipe book */
123    virtual bool allocLayerPipes(hwc_context_t *ctx,
124                                 hwc_display_contents_1_t* list) = 0;
125    /* configures MPD pipes */
126    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
127                          PipeLayerPair& pipeLayerPair) = 0;
128
129    /* set/reset flags for MDPComp */
130    void setMDPCompLayerFlags(hwc_context_t *ctx,
131                              hwc_display_contents_1_t* list);
132    /* allocate MDP pipes from overlay */
133    ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type);
134
135    /* checks for conditions where mdpcomp is not possible */
136    bool isFrameDoable(hwc_context_t *ctx);
137    /* checks for conditions where RGB layers cannot be bypassed */
138    bool isFullFrameDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
139    /* checks if full MDP comp can be done */
140    bool fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
141    /* check if we can use layer cache to do at least partial MDP comp */
142    bool partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
143    /* checks for conditions where only video can be bypassed */
144    bool isOnlyVideoDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
145    /* checks for conditions where YUV layers cannot be bypassed */
146    bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
147
148    /* set up Border fill as Base pipe */
149    static bool setupBasePipe(hwc_context_t*);
150    /* Is debug enabled */
151    static bool isDebug() { return sDebugLogs ? true : false; };
152    /* Is feature enabled */
153    static bool isEnabled() { return sEnabled; };
154    /* checks for mdp comp dimension limitation */
155    bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer);
156    /* tracks non updating layers*/
157    void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list);
158    /* optimize layers for mdp comp*/
159    void batchLayers();
160    /* gets available pipes for mdp comp */
161    int getAvailablePipes(hwc_context_t* ctx);
162    /* updates cache map with YUV info */
163    void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list);
164    bool programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list);
165    bool programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list);
166
167    int mDpy;
168    static bool sEnabled;
169    static bool sDebugLogs;
170    static bool sIdleFallBack;
171    static int sMaxPipesPerMixer;
172    static IdleInvalidator *idleInvalidator;
173    struct FrameInfo mCurrentFrame;
174    struct LayerCache mCachedFrame;
175};
176
177class MDPCompLowRes : public MDPComp {
178public:
179    explicit MDPCompLowRes(int dpy):MDPComp(dpy){};
180    virtual ~MDPCompLowRes(){};
181    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
182
183private:
184    struct MdpPipeInfoLowRes : public MdpPipeInfo {
185        ovutils::eDest index;
186        virtual ~MdpPipeInfoLowRes() {};
187    };
188
189    virtual int pipesForFB() { return 1; };
190    /* configure's overlay pipes for the frame */
191    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
192                          PipeLayerPair& pipeLayerPair);
193
194    /* allocates pipes to selected candidates */
195    virtual bool allocLayerPipes(hwc_context_t *ctx,
196                                 hwc_display_contents_1_t* list);
197
198    virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
199};
200
201class MDPCompHighRes : public MDPComp {
202public:
203    explicit MDPCompHighRes(int dpy):MDPComp(dpy){};
204    virtual ~MDPCompHighRes(){};
205    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
206private:
207    struct MdpPipeInfoHighRes : public MdpPipeInfo {
208        ovutils::eDest lIndex;
209        ovutils::eDest rIndex;
210        virtual ~MdpPipeInfoHighRes() {};
211    };
212
213    bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
214                         MdpPipeInfoHighRes& pipe_info, ePipeType type);
215
216    virtual int pipesForFB() { return 2; };
217    /* configure's overlay pipes for the frame */
218    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
219                          PipeLayerPair& pipeLayerPair);
220
221    /* allocates pipes to selected candidates */
222    virtual bool allocLayerPipes(hwc_context_t *ctx,
223                                 hwc_display_contents_1_t* list);
224
225    virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
226};
227}; //namespace
228#endif
229