blob: 7970cd3afddf66775d4a010e63276cd3508e6502 [file] [log] [blame]
Naseer Ahmed7c958d42012-07-31 18:57:03 -07001/*
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -08002 * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3 *
Naseer Ahmed7c958d42012-07-31 18:57:03 -07004 * 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
Naseer Ahmed7c958d42012-07-31 18:57:03 -070028#define DEFAULT_IDLE_TIME 2000
Sushil Chauhan69f2bb22013-02-13 10:50:47 -080029#define MAX_PIPES_PER_MIXER 4
Naseer Ahmed7c958d42012-07-31 18:57:03 -070030
Saurabh Shahacf10202013-02-26 10:15:15 -080031namespace overlay {
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080032class Rotator;
Saurabh Shahacf10202013-02-26 10:15:15 -080033};
34
Naseer Ahmed7c958d42012-07-31 18:57:03 -070035namespace qhwc {
Naseer Ahmed54821fe2012-11-28 18:44:38 -050036namespace ovutils = overlay::utils;
Naseer Ahmed7c958d42012-07-31 18:57:03 -070037
38class MDPComp {
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080039public:
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080040 explicit MDPComp(int);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080041 virtual ~MDPComp(){};
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080042 /*sets up mdp comp for the current frame */
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080043 int prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080044 /* draw */
45 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080046 /* dumpsys */
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080047 void dump(android::String8& buf);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080048
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080049 static MDPComp* getObject(const int& width, const int dpy);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080050 /* Handler to invoke frame redraw on Idle Timer expiry */
51 static void timeout_handler(void *udata);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080052 /* Initialize MDP comp*/
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080053 static bool init(hwc_context_t *ctx);
54
55protected:
Naseer Ahmed54821fe2012-11-28 18:44:38 -050056 enum ePipeType {
57 MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
58 MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080059 MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
Naseer Ahmed54821fe2012-11-28 18:44:38 -050060 MDPCOMP_OV_ANY,
Naseer Ahmed7c958d42012-07-31 18:57:03 -070061 };
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080062
63 /* mdp pipe data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080064 struct MdpPipeInfo {
65 int zOrder;
66 virtual ~MdpPipeInfo(){};
67 };
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080068
69 /* per layer data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080070 struct PipeLayerPair {
71 MdpPipeInfo *pipeInfo;
Saurabh Shahacf10202013-02-26 10:15:15 -080072 overlay::Rotator* rot;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080073 int listIndex;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080074 };
75
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080076 /* per frame data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080077 struct FrameInfo {
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080078 /* maps layer list to mdp list */
79 int layerCount;
80 int layerToMDP[MAX_NUM_LAYERS];
81
82 /* maps mdp list to layer list */
83 int mdpCount;
84 struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
85
86 /* layer composing on FB? */
87 int fbCount;
88 bool isFBComposed[MAX_NUM_LAYERS];
89
90 bool needsRedraw;
91 int fbZ;
92
93 /* c'tor */
94 FrameInfo();
95 /* clear old frame data */
96 void reset();
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080097 };
98
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080099 /* cached data */
100 struct LayerCache {
101 int layerCount;
102 int mdpCount;
103 int cacheCount;
104 buffer_handle_t hnd[MAX_NUM_LAYERS];
105
106 /* c'tor */
107 LayerCache();
108 /* clear caching info*/
109 void reset();
110 };
111
112 /* No of pipes needed for Framebuffer */
113 virtual int pipesForFB() = 0;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800114 /* calculates pipes needed for the panel */
115 virtual int pipesNeeded(hwc_context_t *ctx,
116 hwc_display_contents_1_t* list) = 0;
117 /* allocates pipe from pipe book */
118 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800119 hwc_display_contents_1_t* list) = 0;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800120 /* configures MPD pipes */
121 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800122 PipeLayerPair& pipeLayerPair) = 0;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800123
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700124
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800125 /* set/reset flags for MDPComp */
126 void setMDPCompLayerFlags(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800127 hwc_display_contents_1_t* list);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800128 /* allocate MDP pipes from overlay */
129 ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800130
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800131 /* checks for conditions where mdpcomp is not possible */
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800132 bool isFrameDoable(hwc_context_t *ctx);
133 /* checks for conditions where RGB layers cannot be bypassed */
134 bool isFullFrameDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
135 /* checks for conditions where YUV layers cannot be bypassed */
136 bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
137
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800138 /* set up Border fill as Base pipe */
139 static bool setupBasePipe(hwc_context_t*);
140 /* Is debug enabled */
141 static bool isDebug() { return sDebugLogs ? true : false; };
142 /* Is feature enabled */
143 static bool isEnabled() { return sEnabled; };
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800144 /* checks for mdp comp width limitation */
145 bool isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800146 /* tracks non updating layers*/
147 void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list);
148 /* resets cache for complete fallback */
149 void resetFrameForFB(hwc_context_t* ctx, hwc_display_contents_1_t* list);
150 /* optimize layers for mdp comp*/
151 void batchLayers();
152 /* gets available pipes for mdp comp */
153 int getAvailablePipes(hwc_context_t* ctx);
154 /* updates cache map with YUV info */
155 void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list);
156 int programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800157
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800158
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800159 int mDpy;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800160 static bool sEnabled;
161 static bool sDebugLogs;
162 static bool sIdleFallBack;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800163 static int sMaxPipesPerMixer;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800164 static IdleInvalidator *idleInvalidator;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800165 struct FrameInfo mCurrentFrame;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800166 struct LayerCache mCachedFrame;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800167};
168
169class MDPCompLowRes : public MDPComp {
170public:
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800171 explicit MDPCompLowRes(int dpy):MDPComp(dpy){};
172 virtual ~MDPCompLowRes(){};
173 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800174
175private:
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800176 struct MdpPipeInfoLowRes : public MdpPipeInfo {
177 ovutils::eDest index;
178 virtual ~MdpPipeInfoLowRes() {};
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700179 };
180
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800181 virtual int pipesForFB() { return 1; };
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700182 /* configure's overlay pipes for the frame */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800183 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800184 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800185
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700186 /* allocates pipes to selected candidates */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800187 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800188 hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800189
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800190 virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700191};
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800192
193class MDPCompHighRes : public MDPComp {
194public:
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800195 explicit MDPCompHighRes(int dpy):MDPComp(dpy){};
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800196 virtual ~MDPCompHighRes(){};
197 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
198private:
199 struct MdpPipeInfoHighRes : public MdpPipeInfo {
200 ovutils::eDest lIndex;
201 ovutils::eDest rIndex;
202 virtual ~MdpPipeInfoHighRes() {};
203 };
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800204
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800205 bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800206 MdpPipeInfoHighRes& pipe_info, ePipeType type);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800207
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800208 virtual int pipesForFB() { return 2; };
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800209 /* configure's overlay pipes for the frame */
210 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800211 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800212
213 /* allocates pipes to selected candidates */
214 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800215 hwc_display_contents_1_t* list);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800216
217 virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800218};
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700219}; //namespace
220#endif