blob: 5b47984a6f6a0d6787a4474c148841ff95796b73 [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
Sushil Chauhan69f2bb22013-02-13 10:50:47 -080028#define MAX_PIPES_PER_MIXER 4
Naseer Ahmed7c958d42012-07-31 18:57:03 -070029
Saurabh Shahacf10202013-02-26 10:15:15 -080030namespace overlay {
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080031class Rotator;
Saurabh Shahacf10202013-02-26 10:15:15 -080032};
33
Naseer Ahmed7c958d42012-07-31 18:57:03 -070034namespace qhwc {
Naseer Ahmed54821fe2012-11-28 18:44:38 -050035namespace ovutils = overlay::utils;
Naseer Ahmed7c958d42012-07-31 18:57:03 -070036
37class MDPComp {
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080038public:
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080039 explicit MDPComp(int);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080040 virtual ~MDPComp(){};
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080041 /*sets up mdp comp for the current frame */
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080042 int prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080043 /* draw */
44 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
Raj Kamal4393eaa2014-06-06 13:45:20 +053045 //Reset values
46 void reset();
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080047 /* dumpsys */
Jeykumar Sankaran6850ac62014-05-27 10:07:26 -070048 void dump(android::String8& buf, hwc_context_t *ctx);
Ramkumar Radhakrishnan8bb48d32013-12-30 23:11:27 -080049 bool isGLESOnlyComp() { return (mCurrentFrame.mdpCount == 0); }
Sushil Chauhandefd3522014-05-13 18:17:12 -070050 int drawOverlap(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shah88e4d272013-09-03 13:31:29 -070051 static MDPComp* getObject(hwc_context_t *ctx, const int& dpy);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080052 /* Handler to invoke frame redraw on Idle Timer expiry */
53 static void timeout_handler(void *udata);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080054 /* Initialize MDP comp*/
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080055 static bool init(hwc_context_t *ctx);
Saurabh Shah98acd092013-05-03 10:48:24 -070056 static void resetIdleFallBack() { sIdleFallBack = false; }
Ramkumar Radhakrishnanfb822912014-03-14 17:28:14 -070057 static bool isIdleFallback() { return sIdleFallBack; }
Naseer Ahmed35a268c2014-06-24 19:07:13 -040058 static void dynamicDebug(bool enable){ sDebugLogs = enable; }
Saurabh Shah59562ff2014-09-30 16:13:12 -070059 static void setIdleTimeout(const uint32_t& timeout);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080060
61protected:
Saurabh Shahe9bc60f2013-08-29 12:58:06 -070062 enum { MAX_SEC_LAYERS = 1 }; //TODO add property support
63
Naseer Ahmed54821fe2012-11-28 18:44:38 -050064 enum ePipeType {
65 MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
66 MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080067 MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
Naseer Ahmed54821fe2012-11-28 18:44:38 -050068 MDPCOMP_OV_ANY,
Naseer Ahmed7c958d42012-07-31 18:57:03 -070069 };
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080070
Jeykumar Sankaran0ad97c42014-03-09 23:00:53 -070071 //Simulation flags
72 enum {
73 MDPCOMP_AVOID_FULL_MDP = 0x001,
74 MDPCOMP_AVOID_CACHE_MDP = 0x002,
75 MDPCOMP_AVOID_LOAD_MDP = 0x004,
76 MDPCOMP_AVOID_VIDEO_ONLY = 0x008,
Ramkumar Radhakrishnan4ec775f2014-07-23 17:43:18 -070077 MDPCOMP_AVOID_MDP_ONLY_LAYERS = 0x010,
Ramkumar Radhakrishnan9d7bc312014-08-13 19:38:13 -070078 MDPCOMP_AVOID_AIV_VIDEO_MODE = 0x020,
Jeykumar Sankaran0ad97c42014-03-09 23:00:53 -070079 };
80
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080081 /* mdp pipe data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080082 struct MdpPipeInfo {
83 int zOrder;
84 virtual ~MdpPipeInfo(){};
85 };
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080086
radhakrishnac9a67412013-09-25 17:40:42 +053087 struct MdpYUVPipeInfo : public MdpPipeInfo{
88 ovutils::eDest lIndex;
89 ovutils::eDest rIndex;
90 virtual ~MdpYUVPipeInfo(){};
91 };
92
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080093 /* per layer data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080094 struct PipeLayerPair {
95 MdpPipeInfo *pipeInfo;
Saurabh Shahacf10202013-02-26 10:15:15 -080096 overlay::Rotator* rot;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -080097 int listIndex;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080098 };
99
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800100 /* per frame data */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800101 struct FrameInfo {
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800102 /* maps layer list to mdp list */
103 int layerCount;
Ramkumar Radhakrishnane661f962013-06-05 17:21:38 -0700104 int layerToMDP[MAX_NUM_APP_LAYERS];
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800105
106 /* maps mdp list to layer list */
107 int mdpCount;
108 struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
109
110 /* layer composing on FB? */
111 int fbCount;
Ramkumar Radhakrishnane661f962013-06-05 17:21:38 -0700112 bool isFBComposed[MAX_NUM_APP_LAYERS];
Jeykumar Sankaran6a9bb9e2013-08-01 14:19:26 -0700113 /* layers lying outside ROI. Will
114 * be dropped off from the composition */
115 int dropCount;
116 bool drop[MAX_NUM_APP_LAYERS];
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800117
118 bool needsRedraw;
119 int fbZ;
120
121 /* c'tor */
122 FrameInfo();
123 /* clear old frame data */
Saurabh Shahaa236822013-04-24 18:07:26 -0700124 void reset(const int& numLayers);
125 void map();
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800126 };
127
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800128 /* cached data */
129 struct LayerCache {
130 int layerCount;
Ramkumar Radhakrishnane661f962013-06-05 17:21:38 -0700131 buffer_handle_t hnd[MAX_NUM_APP_LAYERS];
Prabhanjan Kandula2243aa62013-10-24 12:58:55 +0530132 bool isFBComposed[MAX_NUM_APP_LAYERS];
133 bool drop[MAX_NUM_APP_LAYERS];
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800134
135 /* c'tor */
136 LayerCache();
137 /* clear caching info*/
138 void reset();
Saurabh Shahaa236822013-04-24 18:07:26 -0700139 void cacheAll(hwc_display_contents_1_t* list);
140 void updateCounts(const FrameInfo&);
Jeykumar Sankaran988d3682013-11-15 11:57:16 -0800141 bool isSameFrame(const FrameInfo& curFrame,
142 hwc_display_contents_1_t* list);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800143 };
144
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800145 /* allocates pipe from pipe book */
146 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800147 hwc_display_contents_1_t* list) = 0;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800148 /* configures MPD pipes */
149 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800150 PipeLayerPair& pipeLayerPair) = 0;
Saurabh Shah3d4b8042013-12-10 15:19:17 -0800151 /* Increments mdpCount if 4k2k yuv layer split is enabled.
152 * updates framebuffer z order if fb lies above source-split layer */
153 virtual void adjustForSourceSplit(hwc_context_t *ctx,
radhakrishnac9a67412013-09-25 17:40:42 +0530154 hwc_display_contents_1_t* list) = 0;
155 /* configures 4kx2k yuv layer*/
156 virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
157 PipeLayerPair& PipeLayerPair) = 0;
Jeykumar Sankaran6c7eeac2013-11-18 11:19:45 -0800158 /* generates ROI based on the modified area of the frame */
159 virtual void generateROI(hwc_context_t *ctx,
160 hwc_display_contents_1_t* list) = 0;
161 /* validates the ROI generated for fallback conditions */
162 virtual bool validateAndApplyROI(hwc_context_t *ctx,
163 hwc_display_contents_1_t* list) = 0;
164 /* Trims fbRect calculated against ROI generated */
165 virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect) = 0;
166
Jeykumar Sankaran1e156112014-04-30 11:03:23 -0700167 /* set/reset flags for MDPComp */
168 void setMDPCompLayerFlags(hwc_context_t *ctx,
169 hwc_display_contents_1_t* list);
Saurabh Shahdf4741d2013-12-12 16:40:28 -0800170 void setRedraw(hwc_context_t *ctx,
171 hwc_display_contents_1_t* list);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800172 /* checks for conditions where mdpcomp is not possible */
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800173 bool isFrameDoable(hwc_context_t *ctx);
174 /* checks for conditions where RGB layers cannot be bypassed */
Saurabh Shahdf4741d2013-12-12 16:40:28 -0800175 bool tryFullFrame(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahaa236822013-04-24 18:07:26 -0700176 /* checks if full MDP comp can be done */
177 bool fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Sushil Chauhandefd3522014-05-13 18:17:12 -0700178 /* Full MDP Composition with Peripheral Tiny Overlap Removal */
179 bool fullMDPCompWithPTOR(hwc_context_t *ctx,hwc_display_contents_1_t* list);
Saurabh Shahaa236822013-04-24 18:07:26 -0700180 /* check if we can use layer cache to do at least partial MDP comp */
181 bool partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shah8028e3b2013-10-15 12:27:59 -0700182 /* Partial MDP comp that uses caching to save power as primary goal */
183 bool cacheBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahbe7bd322014-02-20 16:18:45 -0800184 /* Partial MDP comp that balances the load between MDP and GPU such that
185 * MDP is loaded to the max of its capacity. The lower z order layers are
186 * fed to MDP, whereas the upper ones to GPU, because the upper ones have
187 * lower number of pixels and can reduce GPU processing time */
188 bool loadBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shah8028e3b2013-10-15 12:27:59 -0700189 /* Checks if its worth doing load based partial comp */
Arun Kumar K.R2aa44c62014-01-21 23:08:28 -0800190 bool isLoadBasedCompDoable(hwc_context_t *ctx);
Ramkumar Radhakrishnan9d7bc312014-08-13 19:38:13 -0700191 /* checks for conditions where AIV layers cannot be bypassed */
192 bool tryAIVVideoMode(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahaa236822013-04-24 18:07:26 -0700193 /* checks for conditions where only video can be bypassed */
Saurabh Shahdf4741d2013-12-12 16:40:28 -0800194 bool tryVideoOnly(hwc_context_t *ctx, hwc_display_contents_1_t* list);
195 bool videoOnlyComp(hwc_context_t *ctx, hwc_display_contents_1_t* list,
Saurabh Shah90b7b9b2013-09-12 16:36:08 -0700196 bool secureOnly);
Ramkumar Radhakrishnan4ec775f2014-07-23 17:43:18 -0700197 /* checks for conditions where only secure RGB and video can be bypassed */
198 bool tryMDPOnlyLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list);
199 bool mdpOnlyLayersComp(hwc_context_t *ctx, hwc_display_contents_1_t* list,
200 bool secureOnly);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800201 /* checks for conditions where YUV layers cannot be bypassed */
202 bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
Ramkumar Radhakrishnan4ec775f2014-07-23 17:43:18 -0700203 /* checks for conditions where Secure RGB layers cannot be bypassed */
204 bool isSecureRGBDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
Prabhanjan Kandula21918db2013-11-26 15:51:58 +0530205 /* checks if MDP/MDSS can process current list w.r.to HW limitations
206 * All peculiar HW limitations should go here */
207 bool hwLimitationsCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800208 /* Is debug enabled */
209 static bool isDebug() { return sDebugLogs ? true : false; };
210 /* Is feature enabled */
211 static bool isEnabled() { return sEnabled; };
Sravan Kumar D.V.Nad5d9292013-04-24 14:23:04 +0530212 /* checks for mdp comp dimension limitation */
213 bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800214 /* tracks non updating layers*/
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700215 void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list,
216 FrameInfo& frame);
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800217 /* optimize layers for mdp comp*/
Prabhanjan Kandula9bd5f642013-09-25 17:00:36 +0530218 bool markLayersForCaching(hwc_context_t* ctx,
219 hwc_display_contents_1_t* list);
220 int getBatch(hwc_display_contents_1_t* list,
221 int& maxBatchStart, int& maxBatchEnd,
222 int& maxBatchCount);
223 bool canPushBatchToTop(const hwc_display_contents_1_t* list,
224 int fromIndex, int toIndex);
225 bool intersectingUpdatingLayers(const hwc_display_contents_1_t* list,
226 int fromIndex, int toIndex, int targetLayerIndex);
227
Ramkumar Radhakrishnan9d7bc312014-08-13 19:38:13 -0700228 /* Mark AIV layers for composition and drop other non-AIV layers.*/
229 void updateAIVLayers(hwc_context_t* ctx, hwc_display_contents_1_t* list);
230
Prabhanjan Kandula9bd5f642013-09-25 17:00:36 +0530231 /* updates cache map with YUV info */
Saurabh Shah90b7b9b2013-09-12 16:36:08 -0700232 void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
Arun Kumar K.Ra727a882014-08-20 17:14:26 -0700233 bool secureOnly, FrameInfo& frame);
Ramkumar Radhakrishnan4ec775f2014-07-23 17:43:18 -0700234 /* updates cache map with secure RGB info */
235 void updateSecureRGB(hwc_context_t* ctx,
236 hwc_display_contents_1_t* list);
Saurabh Shahdf4741d2013-12-12 16:40:28 -0800237 /* Validates if the GPU/MDP layer split chosen by a strategy is supported
238 * by MDP.
239 * Sets up MDP comp data structures to reflect covnversion from layers to
240 * overlay pipes.
241 * Configures overlay.
242 * Configures if GPU should redraw.
243 */
244 bool postHeuristicsHandling(hwc_context_t *ctx,
245 hwc_display_contents_1_t* list);
246 void reset(hwc_context_t *ctx);
Saurabh Shahe9bc60f2013-08-29 12:58:06 -0700247 bool isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer);
Ramkumar Radhakrishnan9d20b392013-11-15 19:32:47 -0800248 bool resourceCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
Jeykumar Sankaran6c7eeac2013-11-18 11:19:45 -0800249 hwc_rect_t getUpdatingFBRect(hwc_context_t *ctx,
250 hwc_display_contents_1_t* list);
251 /* checks for conditions to enable partial udpate */
252 bool canPartialUpdate(hwc_context_t *ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800253
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800254 int mDpy;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800255 static bool sEnabled;
Jeykumar Sankaran24c199d2013-05-24 09:40:36 -0700256 static bool sEnableMixedMode;
Jeykumar Sankaran0ad97c42014-03-09 23:00:53 -0700257 static int sSimulationFlags;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800258 static bool sDebugLogs;
259 static bool sIdleFallBack;
Ramkumar Radhakrishnan92abb4f2014-02-06 21:31:29 -0800260 /* Handles the timeout event from kernel, if the value is set to true */
261 static bool sHandleTimeout;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800262 static int sMaxPipesPerMixer;
Manoj Kumar AVM8cbbf7c2014-03-11 01:15:31 -0700263 static bool sSrcSplitEnabled;
Saurabh Shah59562ff2014-09-30 16:13:12 -0700264 static IdleInvalidator *sIdleInvalidator;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800265 struct FrameInfo mCurrentFrame;
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800266 struct LayerCache mCachedFrame;
radhakrishnac9a67412013-09-25 17:40:42 +0530267 //Enable 4kx2k yuv layer split
Raj Kamal389d6e32014-08-04 14:43:24 +0530268 static bool sEnableYUVsplit;
Raj Kamal4393eaa2014-06-06 13:45:20 +0530269 bool mModeOn; // if prepare happened
Arun Kumar K.R2aa44c62014-01-21 23:08:28 -0800270 bool allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index);
Dileep Kumar Reddi4070e932014-09-30 09:00:57 +0530271 //Enable Partial Update for MDP3 targets
272 static bool enablePartialUpdateForMDP3;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800273};
274
Saurabh Shah88e4d272013-09-03 13:31:29 -0700275class MDPCompNonSplit : public MDPComp {
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800276public:
Saurabh Shah88e4d272013-09-03 13:31:29 -0700277 explicit MDPCompNonSplit(int dpy):MDPComp(dpy){};
278 virtual ~MDPCompNonSplit(){};
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800279 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800280
281private:
Saurabh Shah88e4d272013-09-03 13:31:29 -0700282 struct MdpPipeInfoNonSplit : public MdpPipeInfo {
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800283 ovutils::eDest index;
Saurabh Shah88e4d272013-09-03 13:31:29 -0700284 virtual ~MdpPipeInfoNonSplit() {};
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700285 };
286
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700287 /* configure's overlay pipes for the frame */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800288 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800289 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800290
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700291 /* allocates pipes to selected candidates */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800292 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800293 hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800294
Saurabh Shah3d4b8042013-12-10 15:19:17 -0800295 /* Increments mdpCount if 4k2k yuv layer split is enabled.
296 * updates framebuffer z order if fb lies above source-split layer */
297 virtual void adjustForSourceSplit(hwc_context_t *ctx,
Arun Kumar K.R2aa44c62014-01-21 23:08:28 -0800298 hwc_display_contents_1_t* list);
radhakrishnac9a67412013-09-25 17:40:42 +0530299
300 /* configures 4kx2k yuv layer to 2 VG pipes*/
301 virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
302 PipeLayerPair& PipeLayerPair);
Jeykumar Sankaran6c7eeac2013-11-18 11:19:45 -0800303 /* generates ROI based on the modified area of the frame */
304 virtual void generateROI(hwc_context_t *ctx,
305 hwc_display_contents_1_t* list);
306 /* validates the ROI generated for fallback conditions */
307 virtual bool validateAndApplyROI(hwc_context_t *ctx,
308 hwc_display_contents_1_t* list);
309 /* Trims fbRect calculated against ROI generated */
310 virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700311};
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800312
Saurabh Shah88e4d272013-09-03 13:31:29 -0700313class MDPCompSplit : public MDPComp {
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800314public:
Saurabh Shah88e4d272013-09-03 13:31:29 -0700315 explicit MDPCompSplit(int dpy):MDPComp(dpy){};
316 virtual ~MDPCompSplit(){};
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800317 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
Saurabh Shahab47c692014-02-12 18:45:57 -0800318
319protected:
Saurabh Shah88e4d272013-09-03 13:31:29 -0700320 struct MdpPipeInfoSplit : public MdpPipeInfo {
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800321 ovutils::eDest lIndex;
322 ovutils::eDest rIndex;
Saurabh Shah88e4d272013-09-03 13:31:29 -0700323 virtual ~MdpPipeInfoSplit() {};
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800324 };
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800325
Saurabh Shahab47c692014-02-12 18:45:57 -0800326 virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
Saurabh Shahc62f3982014-03-05 14:28:26 -0800327 MdpPipeInfoSplit& pipe_info);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800328
329 /* configure's overlay pipes for the frame */
330 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800331 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800332
333 /* allocates pipes to selected candidates */
334 virtual bool allocLayerPipes(hwc_context_t *ctx,
Jeykumar Sankaran85977e32013-02-25 17:06:08 -0800335 hwc_display_contents_1_t* list);
Saurabh Shahab47c692014-02-12 18:45:57 -0800336private:
Saurabh Shah3d4b8042013-12-10 15:19:17 -0800337 /* Increments mdpCount if 4k2k yuv layer split is enabled.
338 * updates framebuffer z order if fb lies above source-split layer */
339 virtual void adjustForSourceSplit(hwc_context_t *ctx,
radhakrishnac9a67412013-09-25 17:40:42 +0530340 hwc_display_contents_1_t* list);
341
342 /* configures 4kx2k yuv layer*/
343 virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
344 PipeLayerPair& PipeLayerPair);
Jeykumar Sankaran6c7eeac2013-11-18 11:19:45 -0800345 /* generates ROI based on the modified area of the frame */
346 virtual void generateROI(hwc_context_t *ctx,
347 hwc_display_contents_1_t* list);
348 /* validates the ROI generated for fallback conditions */
349 virtual bool validateAndApplyROI(hwc_context_t *ctx,
350 hwc_display_contents_1_t* list);
351 /* Trims fbRect calculated against ROI generated */
352 virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800353};
Saurabh Shah2a4eb1b2013-07-22 16:33:23 -0700354
Saurabh Shahab47c692014-02-12 18:45:57 -0800355class MDPCompSrcSplit : public MDPCompSplit {
356public:
357 explicit MDPCompSrcSplit(int dpy) : MDPCompSplit(dpy){};
358 virtual ~MDPCompSrcSplit(){};
359private:
360 virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
Saurabh Shahc62f3982014-03-05 14:28:26 -0800361 MdpPipeInfoSplit& pipe_info);
Saurabh Shahab47c692014-02-12 18:45:57 -0800362
Saurabh Shahab47c692014-02-12 18:45:57 -0800363 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
364 PipeLayerPair& pipeLayerPair);
365};
366
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700367}; //namespace
368#endif