hwc_mdpcomp.h revision 218456e025e792c12124c8d7a9e35c9df0fc1f5d
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& rightSplit,
50            const int& dpy);
51    /* Handler to invoke frame redraw on Idle Timer expiry */
52    static void timeout_handler(void *udata);
53    /* Initialize MDP comp*/
54    static bool init(hwc_context_t *ctx);
55    static void resetIdleFallBack() { sIdleFallBack = false; }
56
57protected:
58    enum { MAX_SEC_LAYERS = 1 }; //TODO add property support
59
60    enum ePipeType {
61        MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
62        MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
63        MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
64        MDPCOMP_OV_ANY,
65    };
66
67    /* mdp pipe data */
68    struct MdpPipeInfo {
69        int zOrder;
70        virtual ~MdpPipeInfo(){};
71    };
72
73    /* per layer data */
74    struct PipeLayerPair {
75        MdpPipeInfo *pipeInfo;
76        overlay::Rotator* rot;
77        int listIndex;
78    };
79
80    /* per frame data */
81    struct FrameInfo {
82        /* maps layer list to mdp list */
83        int layerCount;
84        int layerToMDP[MAX_NUM_APP_LAYERS];
85
86        /* maps mdp list to layer list */
87        int mdpCount;
88        struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
89
90        /* layer composing on FB? */
91        int fbCount;
92        bool isFBComposed[MAX_NUM_APP_LAYERS];
93
94        bool needsRedraw;
95        int fbZ;
96
97        /* c'tor */
98        FrameInfo();
99        /* clear old frame data */
100        void reset(const int& numLayers);
101        void map();
102    };
103
104    /* cached data */
105    struct LayerCache {
106        int layerCount;
107        int mdpCount;
108        int fbCount;
109        int fbZ;
110        buffer_handle_t hnd[MAX_NUM_APP_LAYERS];
111
112        /* c'tor */
113        LayerCache();
114        /* clear caching info*/
115        void reset();
116        void cacheAll(hwc_display_contents_1_t* list);
117        void updateCounts(const FrameInfo&);
118    };
119
120    /* allocates pipe from pipe book */
121    virtual bool allocLayerPipes(hwc_context_t *ctx,
122                                 hwc_display_contents_1_t* list) = 0;
123    /* allocate MDP pipes from overlay */
124    ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type, int mixer);
125    /* configures MPD pipes */
126    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
127                          PipeLayerPair& pipeLayerPair) = 0;
128    /* Checks for pipes needed versus pipes available */
129    virtual bool arePipesAvailable(hwc_context_t *ctx,
130            hwc_display_contents_1_t* list) = 0;
131
132    /* set/reset flags for MDPComp */
133    void setMDPCompLayerFlags(hwc_context_t *ctx,
134                              hwc_display_contents_1_t* list);
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    /* Is debug enabled */
149    static bool isDebug() { return sDebugLogs ? true : false; };
150    /* Is feature enabled */
151    static bool isEnabled() { return sEnabled; };
152    /* checks for mdp comp dimension limitation */
153    bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer);
154    /* tracks non updating layers*/
155    void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list);
156    /* optimize layers for mdp comp*/
157    bool batchLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list);
158    /* updates cache map with YUV info */
159    void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list);
160    bool programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list);
161    bool programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list);
162    void reset(const int& numAppLayers, hwc_display_contents_1_t* list);
163    bool isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer);
164
165    int mDpy;
166    static bool sEnabled;
167    static bool sEnableMixedMode;
168    static bool sDebugLogs;
169    static bool sIdleFallBack;
170    static int sMaxPipesPerMixer;
171    static IdleInvalidator *idleInvalidator;
172    struct FrameInfo mCurrentFrame;
173    struct LayerCache mCachedFrame;
174};
175
176class MDPCompLowRes : public MDPComp {
177public:
178    explicit MDPCompLowRes(int dpy):MDPComp(dpy){};
179    virtual ~MDPCompLowRes(){};
180    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
181
182private:
183    struct MdpPipeInfoLowRes : public MdpPipeInfo {
184        ovutils::eDest index;
185        virtual ~MdpPipeInfoLowRes() {};
186    };
187
188    /* configure's overlay pipes for the frame */
189    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
190                          PipeLayerPair& pipeLayerPair);
191
192    /* allocates pipes to selected candidates */
193    virtual bool allocLayerPipes(hwc_context_t *ctx,
194                                 hwc_display_contents_1_t* list);
195
196    /* Checks for pipes needed versus pipes available */
197    virtual bool arePipesAvailable(hwc_context_t *ctx,
198            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    /* configure's overlay pipes for the frame */
217    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
218                          PipeLayerPair& pipeLayerPair);
219
220    /* allocates pipes to selected candidates */
221    virtual bool allocLayerPipes(hwc_context_t *ctx,
222                                 hwc_display_contents_1_t* list);
223
224    /* Checks for pipes needed versus pipes available */
225    virtual bool arePipesAvailable(hwc_context_t *ctx,
226            hwc_display_contents_1_t* list);
227
228    int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list,
229            int mixer);
230};
231
232}; //namespace
233#endif
234