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 31 namespace overlay { 32 class Rotator; 33 }; 34 35 namespace qhwc { 36 namespace ovutils = overlay::utils; 37 38 class MDPComp { 39 public: 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 void reset() { mCurrentFrame.reset(0); } 49 int getMDPCompCount() { return mCurrentFrame.mdpCount; } 50 51 static MDPComp* getObject(const int& width, const int& rightSplit, 52 const int& dpy); 53 /* Handler to invoke frame redraw on Idle Timer expiry */ 54 static void timeout_handler(void *udata); 55 /* Initialize MDP comp*/ 56 static bool init(hwc_context_t *ctx); 57 static void resetIdleFallBack() { sIdleFallBack = false; } 58 59 protected: 60 enum { MAX_SEC_LAYERS = 1 }; //TODO add property support 61 62 enum ePipeType { 63 MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB, 64 MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG, 65 MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA, 66 MDPCOMP_OV_ANY, 67 }; 68 69 /* mdp pipe data */ 70 struct MdpPipeInfo { 71 int zOrder; 72 virtual ~MdpPipeInfo(){}; 73 }; 74 75 /* per layer data */ 76 struct PipeLayerPair { 77 MdpPipeInfo *pipeInfo; 78 overlay::Rotator* rot; 79 int listIndex; 80 }; 81 82 /* per frame data */ 83 struct FrameInfo { 84 /* maps layer list to mdp list */ 85 int layerCount; 86 int layerToMDP[MAX_NUM_APP_LAYERS]; 87 88 /* maps mdp list to layer list */ 89 int mdpCount; 90 struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER]; 91 92 /* layer composing on FB? */ 93 int fbCount; 94 bool isFBComposed[MAX_NUM_APP_LAYERS]; 95 96 bool needsRedraw; 97 int fbZ; 98 99 /* c'tor */ 100 FrameInfo(); 101 /* clear old frame data */ 102 void reset(const int& numLayers); 103 void map(); 104 }; 105 106 /* cached data */ 107 struct LayerCache { 108 int layerCount; 109 int mdpCount; 110 int fbCount; 111 int fbZ; 112 buffer_handle_t hnd[MAX_NUM_APP_LAYERS]; 113 114 /* c'tor */ 115 LayerCache(); 116 /* clear caching info*/ 117 void reset(); 118 void cacheAll(hwc_display_contents_1_t* list); 119 void updateCounts(const FrameInfo&); 120 }; 121 122 /* allocates pipe from pipe book */ 123 virtual bool allocLayerPipes(hwc_context_t *ctx, 124 hwc_display_contents_1_t* list) = 0; 125 /* allocate MDP pipes from overlay */ 126 ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type, int mixer); 127 /* configures MPD pipes */ 128 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 129 PipeLayerPair& pipeLayerPair) = 0; 130 /* Checks for pipes needed versus pipes available */ 131 virtual bool arePipesAvailable(hwc_context_t *ctx, 132 hwc_display_contents_1_t* list) = 0; 133 134 /* set/reset flags for MDPComp */ 135 void setMDPCompLayerFlags(hwc_context_t *ctx, 136 hwc_display_contents_1_t* list); 137 /* checks for conditions where mdpcomp is not possible */ 138 bool isFrameDoable(hwc_context_t *ctx); 139 /* checks for conditions where RGB layers cannot be bypassed */ 140 bool isFullFrameDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list); 141 /* checks if full MDP comp can be done */ 142 bool fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list); 143 /* check if we can use layer cache to do at least partial MDP comp */ 144 bool partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list); 145 /* Partial MDP comp that uses caching to save power as primary goal */ 146 bool cacheBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list); 147 /* Partial MDP comp that uses number of pixels to optimize perf goal */ 148 bool loadBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list); 149 /* Checks if its worth doing load based partial comp */ 150 bool isLoadBasedCompDoable(hwc_context_t *ctx, 151 hwc_display_contents_1_t* list); 152 /* checks for conditions where only video can be bypassed */ 153 bool isOnlyVideoDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list); 154 /* checks for conditions where YUV layers cannot be bypassed */ 155 bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer); 156 157 /* Is debug enabled */ 158 static bool isDebug() { return sDebugLogs ? true : false; }; 159 /* Is feature enabled */ 160 static bool isEnabled() { return sEnabled; }; 161 /* checks for mdp comp dimension limitation */ 162 bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer); 163 /* tracks non updating layers*/ 164 void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list); 165 /* optimize layers for mdp comp*/ 166 bool batchLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list); 167 /* updates cache map with YUV info */ 168 void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list); 169 bool programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list); 170 bool programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list); 171 void reset(const int& numAppLayers, hwc_display_contents_1_t* list); 172 bool isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer); 173 174 int mDpy; 175 static bool sEnabled; 176 static bool sEnableMixedMode; 177 static bool sDebugLogs; 178 static bool sIdleFallBack; 179 static int sMaxPipesPerMixer; 180 static IdleInvalidator *idleInvalidator; 181 struct FrameInfo mCurrentFrame; 182 struct LayerCache mCachedFrame; 183 }; 184 185 class MDPCompLowRes : public MDPComp { 186 public: 187 explicit MDPCompLowRes(int dpy):MDPComp(dpy){}; 188 virtual ~MDPCompLowRes(){}; 189 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list); 190 191 private: 192 struct MdpPipeInfoLowRes : public MdpPipeInfo { 193 ovutils::eDest index; 194 virtual ~MdpPipeInfoLowRes() {}; 195 }; 196 197 /* configure's overlay pipes for the frame */ 198 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 199 PipeLayerPair& pipeLayerPair); 200 201 /* allocates pipes to selected candidates */ 202 virtual bool allocLayerPipes(hwc_context_t *ctx, 203 hwc_display_contents_1_t* list); 204 205 /* Checks for pipes needed versus pipes available */ 206 virtual bool arePipesAvailable(hwc_context_t *ctx, 207 hwc_display_contents_1_t* list); 208 }; 209 210 class MDPCompHighRes : public MDPComp { 211 public: 212 explicit MDPCompHighRes(int dpy):MDPComp(dpy){}; 213 virtual ~MDPCompHighRes(){}; 214 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list); 215 private: 216 struct MdpPipeInfoHighRes : public MdpPipeInfo { 217 ovutils::eDest lIndex; 218 ovutils::eDest rIndex; 219 virtual ~MdpPipeInfoHighRes() {}; 220 }; 221 222 bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 223 MdpPipeInfoHighRes& pipe_info, ePipeType type); 224 225 /* configure's overlay pipes for the frame */ 226 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 227 PipeLayerPair& pipeLayerPair); 228 229 /* allocates pipes to selected candidates */ 230 virtual bool allocLayerPipes(hwc_context_t *ctx, 231 hwc_display_contents_1_t* list); 232 233 /* Checks for pipes needed versus pipes available */ 234 virtual bool arePipesAvailable(hwc_context_t *ctx, 235 hwc_display_contents_1_t* list); 236 237 int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list, 238 int mixer); 239 }; 240 241 }; //namespace 242 #endif 243