blob: 926f637439e243b2018046d497f962b8cdf0ad9b [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 {
32 class Rotator;
33};
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 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 Sankaranb551ce42013-01-10 16:26:48 -080042 bool 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;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080045
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080046 void dump(android::String8& buf);
47 bool isUsed() { return (mState == MDPCOMP_ON); };
48
49 static MDPComp* getObject(const int& width);
50 /* Handler to invoke frame redraw on Idle Timer expiry */
51 static void timeout_handler(void *udata);
52 static bool init(hwc_context_t *ctx);
53
54protected:
Naseer Ahmed54821fe2012-11-28 18:44:38 -050055 enum eState {
Naseer Ahmed7c958d42012-07-31 18:57:03 -070056 MDPCOMP_ON = 0,
57 MDPCOMP_OFF,
Naseer Ahmed7c958d42012-07-31 18:57:03 -070058 };
59
Naseer Ahmed54821fe2012-11-28 18:44:38 -050060 enum ePipeType {
61 MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
62 MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080063 MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
Naseer Ahmed54821fe2012-11-28 18:44:38 -050064 MDPCOMP_OV_ANY,
Naseer Ahmed7c958d42012-07-31 18:57:03 -070065 };
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080066 struct MdpPipeInfo {
67 int zOrder;
68 virtual ~MdpPipeInfo(){};
69 };
70 struct PipeLayerPair {
71 MdpPipeInfo *pipeInfo;
72 native_handle_t* handle;
Saurabh Shahacf10202013-02-26 10:15:15 -080073 overlay::Rotator* rot;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080074 };
75
76 /* introduced for mixed mode implementation */
77 struct FrameInfo {
78 int count;
79 struct PipeLayerPair* pipeLayer;
80 };
81
82 /* calculates pipes needed for the panel */
83 virtual int pipesNeeded(hwc_context_t *ctx,
84 hwc_display_contents_1_t* list) = 0;
85 /* allocates pipe from pipe book */
86 virtual bool allocLayerPipes(hwc_context_t *ctx,
87 hwc_display_contents_1_t* list,FrameInfo& current_frame) = 0;
88 /* configures MPD pipes */
89 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Saurabh Shahacf10202013-02-26 10:15:15 -080090 PipeLayerPair& pipeLayerPair) = 0;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -080091 /* Is rotation supported */
92 virtual bool canRotate(){ return true; };
93
Naseer Ahmed7c958d42012-07-31 18:57:03 -070094
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080095 /* set/reset flags for MDPComp */
96 void setMDPCompLayerFlags(hwc_context_t *ctx,
97 hwc_display_contents_1_t* list);
98 void unsetMDPCompLayerFlags(hwc_context_t* ctx,
99 hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800100 /* get/set states */
101 eState getState() { return mState; };
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800102 /* reset state */
103 void reset( hwc_context_t *ctx, hwc_display_contents_1_t* list );
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800104 /* allocate MDP pipes from overlay */
105 ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type);
106 /* checks for conditions where mdpcomp is not possible */
107 bool isDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list);
108 /* sets up MDP comp for current frame */
109 bool setup(hwc_context_t* ctx, hwc_display_contents_1_t* list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800110 /* set up Border fill as Base pipe */
111 static bool setupBasePipe(hwc_context_t*);
112 /* Is debug enabled */
113 static bool isDebug() { return sDebugLogs ? true : false; };
114 /* Is feature enabled */
115 static bool isEnabled() { return sEnabled; };
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800116 /* checks for mdp comp width limitation */
117 bool isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800118
119 eState mState;
120
121 static bool sEnabled;
122 static bool sDebugLogs;
123 static bool sIdleFallBack;
124 static IdleInvalidator *idleInvalidator;
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800125 struct FrameInfo mCurrentFrame;
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800126};
127
128class MDPCompLowRes : public MDPComp {
129public:
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800130 virtual ~MDPCompLowRes(){};
131 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800132
133private:
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800134 struct MdpPipeInfoLowRes : public MdpPipeInfo {
135 ovutils::eDest index;
136 virtual ~MdpPipeInfoLowRes() {};
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700137 };
138
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700139 /* configure's overlay pipes for the frame */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800140 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Saurabh Shahacf10202013-02-26 10:15:15 -0800141 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800142
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700143 /* allocates pipes to selected candidates */
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800144 virtual bool allocLayerPipes(hwc_context_t *ctx,
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700145 hwc_display_contents_1_t* list,
Naseer Ahmed54821fe2012-11-28 18:44:38 -0500146 FrameInfo& current_frame);
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800147
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800148 virtual int pipesNeeded(hwc_context_t *ctx,
Saurabh Shahacf10202013-02-26 10:15:15 -0800149 hwc_display_contents_1_t* list);
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700150};
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800151
152class MDPCompHighRes : public MDPComp {
153public:
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800154 virtual ~MDPCompHighRes(){};
155 virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
156private:
157 struct MdpPipeInfoHighRes : public MdpPipeInfo {
158 ovutils::eDest lIndex;
159 ovutils::eDest rIndex;
160 virtual ~MdpPipeInfoHighRes() {};
161 };
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800162
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800163 bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
164 MdpPipeInfoHighRes& pipe_info, ePipeType type);
165
166 /* configure's overlay pipes for the frame */
167 virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
Saurabh Shahacf10202013-02-26 10:15:15 -0800168 PipeLayerPair& pipeLayerPair);
Jeykumar Sankaranb551ce42013-01-10 16:26:48 -0800169
170 /* allocates pipes to selected candidates */
171 virtual bool allocLayerPipes(hwc_context_t *ctx,
172 hwc_display_contents_1_t* list,
173 FrameInfo& current_frame);
174
175 virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
176 virtual bool canRotate(){ return false; };
177};
Naseer Ahmed7c958d42012-07-31 18:57:03 -0700178}; //namespace
179#endif