blob: e1f413ca88093b26f7ec7a0ef818291da7e7da53 [file] [log] [blame]
Naseer Ahmed29a26812012-06-14 00:56:20 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
Arun Kumar K.R361da4f2012-11-28 10:42:59 -08003 * Copyright (C) 2012-2013, The Linux Foundation All rights reserved.
4 *
5 * Not a Contribution, Apache license notifications and license are retained
6 * for attribution purposes only.
Naseer Ahmed29a26812012-06-14 00:56:20 -07007 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
Arun Kumar K.R361da4f2012-11-28 10:42:59 -080020#define HWC_UTILS_DEBUG 0
Naseer Ahmed758bfc52012-11-28 17:02:08 -050021#include <sys/ioctl.h>
Naseer Ahmed5b6708a2012-08-02 13:46:08 -070022#include <EGL/egl.h>
Saurabh Shahfc2acbe2012-08-17 19:47:52 -070023#include <cutils/properties.h>
24#include <gralloc_priv.h>
25#include <fb_priv.h>
Naseer Ahmed758bfc52012-11-28 17:02:08 -050026#include <overlay.h>
Naseer Ahmed29a26812012-06-14 00:56:20 -070027#include "hwc_utils.h"
Naseer Ahmed54821fe2012-11-28 18:44:38 -050028#include "hwc_mdpcomp.h"
Saurabh Shahcf053c62012-12-13 12:32:55 -080029#include "hwc_fbupdate.h"
Naseer Ahmeda87da602012-07-01 23:54:19 -070030#include "mdp_version.h"
Arun Kumar K.R361da4f2012-11-28 10:42:59 -080031#include "hwc_copybit.h"
Saurabh Shah56f610d2012-08-07 15:27:06 -070032#include "external.h"
Saurabh Shah56f610d2012-08-07 15:27:06 -070033#include "QService.h"
Arun Kumar K.R361da4f2012-11-28 10:42:59 -080034#include "comptype.h"
Naseer Ahmed29a26812012-06-14 00:56:20 -070035namespace qhwc {
Naseer Ahmed72cf9762012-07-21 12:17:13 -070036
37// Opens Framebuffer device
38static void openFramebufferDevice(hwc_context_t *ctx)
39{
40 hw_module_t const *module;
41 if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
42 framebuffer_open(module, &(ctx->mFbDev));
Saurabh Shah3e858eb2012-09-17 16:53:21 -070043 private_module_t* m = reinterpret_cast<private_module_t*>(
44 ctx->mFbDev->common.module);
45 //xres, yres may not be 32 aligned
Naseer Ahmed54821fe2012-11-28 18:44:38 -050046 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = m->finfo.line_length /
47 (m->info.xres/8);
Saurabh Shah3e858eb2012-09-17 16:53:21 -070048 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = m->info.xres;
49 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = m->info.yres;
50 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = ctx->mFbDev->xdpi;
51 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ctx->mFbDev->ydpi;
52 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period =
53 1000000000l / ctx->mFbDev->fps;
54 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = openFb(HWC_DISPLAY_PRIMARY);
Naseer Ahmed72cf9762012-07-21 12:17:13 -070055 }
56}
57
Naseer Ahmed29a26812012-06-14 00:56:20 -070058void initContext(hwc_context_t *ctx)
59{
Naseer Ahmed72cf9762012-07-21 12:17:13 -070060 openFramebufferDevice(ctx);
Saurabh Shahc4d034f2012-09-27 15:55:15 -070061 overlay::Overlay::initOverlay();
Naseer Ahmed758bfc52012-11-28 17:02:08 -050062 ctx->mOverlay = overlay::Overlay::getInstance();
Saurabh Shah56f610d2012-08-07 15:27:06 -070063 ctx->mQService = qService::QService::getInstance(ctx);
Naseer Ahmed96c4c952012-07-25 18:27:14 -070064 ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion();
65 ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay();
66 ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType();
Saurabh Shahcf053c62012-12-13 12:32:55 -080067 //Is created and destroyed only once for primary
68 //For external it could get created and destroyed multiple times depending
69 //on what external we connect to.
70 ctx->mFBUpdate[HWC_DISPLAY_PRIMARY] =
71 IFBUpdate::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres,
72 HWC_DISPLAY_PRIMARY);
Arun Kumar K.R361da4f2012-11-28 10:42:59 -080073
74 char value[PROPERTY_VALUE_MAX];
75 // Check if the target supports copybit compostion (dyn/mdp/c2d) to
76 // decide if we need to open the copybit module.
77 int compositionType =
78 qdutils::QCCompositionType::getInstance().getCompositionType();
79
80 if (compositionType & (qdutils::COMPOSITION_TYPE_DYN |
81 qdutils::COMPOSITION_TYPE_MDP |
82 qdutils::COMPOSITION_TYPE_C2D)) {
83 ctx->mCopyBit[HWC_DISPLAY_PRIMARY] = new CopyBit();
84 }
85
Naseer Ahmed72cf9762012-07-21 12:17:13 -070086 ctx->mExtDisplay = new ExternalDisplay(ctx);
Naseer Ahmede78f0522012-12-07 18:24:28 -050087 for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++)
88 ctx->mLayerCache[i] = new LayerCache();
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -080089 ctx->mMDPComp = MDPComp::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres);
Naseer Ahmed54821fe2012-11-28 18:44:38 -050090 MDPComp::init(ctx);
Naseer Ahmed72cf9762012-07-21 12:17:13 -070091
Naseer Ahmedff4f0252012-10-01 13:03:01 -040092 pthread_mutex_init(&(ctx->vstate.lock), NULL);
93 pthread_cond_init(&(ctx->vstate.cond), NULL);
94 ctx->vstate.enable = false;
Amara Venkata Mastan Manoj Kumar75526f52012-12-27 18:27:01 -080095 ctx->mExtDispConfiguring = false;
Naseer Ahmed72cf9762012-07-21 12:17:13 -070096 ALOGI("Initializing Qualcomm Hardware Composer");
Naseer Ahmed96c4c952012-07-25 18:27:14 -070097 ALOGI("MDP version: %d", ctx->mMDP.version);
Naseer Ahmed29a26812012-06-14 00:56:20 -070098}
99
100void closeContext(hwc_context_t *ctx)
101{
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500102 if(ctx->mOverlay) {
103 delete ctx->mOverlay;
104 ctx->mOverlay = NULL;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700105 }
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700106
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800107 for(int i = 0; i< HWC_NUM_DISPLAY_TYPES; i++) {
108 if(ctx->mCopyBit[i]) {
109 delete ctx->mCopyBit[i];
110 ctx->mCopyBit[i] = NULL;
111 }
112 }
113
Naseer Ahmed72cf9762012-07-21 12:17:13 -0700114 if(ctx->mFbDev) {
115 framebuffer_close(ctx->mFbDev);
116 ctx->mFbDev = NULL;
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700117 close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd);
118 ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700119 }
Naseer Ahmed72cf9762012-07-21 12:17:13 -0700120
121 if(ctx->mExtDisplay) {
122 delete ctx->mExtDisplay;
123 ctx->mExtDisplay = NULL;
124 }
Naseer Ahmedff4f0252012-10-01 13:03:01 -0400125
Saurabh Shahcf053c62012-12-13 12:32:55 -0800126 for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
127 if(ctx->mFBUpdate[i]) {
128 delete ctx->mFBUpdate[i];
129 ctx->mFBUpdate[i] = NULL;
130 }
131 }
132
Saurabh Shahcbf7ccc2012-12-19 16:45:51 -0800133 if(ctx->mMDPComp) {
134 delete ctx->mMDPComp;
135 ctx->mMDPComp = NULL;
136 }
137
Naseer Ahmedff4f0252012-10-01 13:03:01 -0400138 pthread_mutex_destroy(&(ctx->vstate.lock));
139 pthread_cond_destroy(&(ctx->vstate.cond));
Naseer Ahmed29a26812012-06-14 00:56:20 -0700140}
141
Naseer Ahmed1d183f52012-11-26 12:35:16 -0500142
143void dumpsys_log(android::String8& buf, const char* fmt, ...)
Naseer Ahmed29a26812012-06-14 00:56:20 -0700144{
Naseer Ahmed1d183f52012-11-26 12:35:16 -0500145 va_list varargs;
146 va_start(varargs, fmt);
147 buf.appendFormatV(fmt, varargs);
148 va_end(varargs);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700149}
150
Naseer Ahmed018e5452012-12-03 14:46:15 -0500151static inline bool isAlphaScaled(hwc_layer_1_t const* layer) {
152 int dst_w, dst_h, src_w, src_h;
153
154 hwc_rect_t displayFrame = layer->displayFrame;
155 hwc_rect_t sourceCrop = layer->sourceCrop;
156
157 dst_w = displayFrame.right - displayFrame.left;
158 dst_h = displayFrame.bottom - displayFrame.top;
159
160 src_w = sourceCrop.right - sourceCrop.left;
161 src_h = sourceCrop.bottom - sourceCrop.top;
162
163 if(((src_w != dst_w) || (src_h != dst_h))) {
164 if(layer->blending != HWC_BLENDING_NONE)
165 return true;
166 }
167 return false;
168}
169
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700170void setListStats(hwc_context_t *ctx,
171 const hwc_display_contents_1_t *list, int dpy) {
172
173 ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1;
174 ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1;
Saurabh Shahc4d034f2012-09-27 15:55:15 -0700175 ctx->listStats[dpy].skipCount = 0;
Naseer Ahmed018e5452012-12-03 14:46:15 -0500176 ctx->listStats[dpy].needsAlphaScale = false;
Jeykumar Sankarancf537002013-01-21 21:19:15 -0800177 ctx->listStats[dpy].yuvCount = 0;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700178
179 for (size_t i = 0; i < list->numHwLayers; i++) {
Naseer Ahmed018e5452012-12-03 14:46:15 -0500180 hwc_layer_1_t const* layer = &list->hwLayers[i];
181 private_handle_t *hnd = (private_handle_t *)layer->handle;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700182
Jeykumar Sankarancf537002013-01-21 21:19:15 -0800183 //reset stored yuv index
184 ctx->listStats[dpy].yuvIndices[i] = -1;
185
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700186 if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
187 continue;
188 //We disregard FB being skip for now! so the else if
Saurabh Shah35712cb2012-09-14 10:28:18 -0700189 } else if (isSkipLayer(&list->hwLayers[i])) {
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700190 ctx->listStats[dpy].skipCount++;
191 }
192
Naseer Ahmed018e5452012-12-03 14:46:15 -0500193 if(!ctx->listStats[dpy].needsAlphaScale)
194 ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer);
195
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700196 if (UNLIKELY(isYuvBuffer(hnd))) {
Jeykumar Sankarancf537002013-01-21 21:19:15 -0800197 int& yuvCount = ctx->listStats[dpy].yuvCount;
198 ctx->listStats[dpy].yuvIndices[yuvCount] = i;
199 yuvCount++;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700200 }
201 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700202}
203
Naseer Ahmed018e5452012-12-03 14:46:15 -0500204
Saurabh Shah541b59d2012-10-11 11:08:12 -0700205static inline void calc_cut(float& leftCutRatio, float& topCutRatio,
206 float& rightCutRatio, float& bottomCutRatio, int orient) {
Saurabh Shah27c1d652012-08-14 19:30:28 -0700207 if(orient & HAL_TRANSFORM_FLIP_H) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700208 swap(leftCutRatio, rightCutRatio);
Saurabh Shah27c1d652012-08-14 19:30:28 -0700209 }
210 if(orient & HAL_TRANSFORM_FLIP_V) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700211 swap(topCutRatio, bottomCutRatio);
Saurabh Shah27c1d652012-08-14 19:30:28 -0700212 }
213 if(orient & HAL_TRANSFORM_ROT_90) {
214 //Anti clock swapping
Saurabh Shah541b59d2012-10-11 11:08:12 -0700215 float tmpCutRatio = leftCutRatio;
216 leftCutRatio = topCutRatio;
217 topCutRatio = rightCutRatio;
218 rightCutRatio = bottomCutRatio;
219 bottomCutRatio = tmpCutRatio;
Saurabh Shah27c1d652012-08-14 19:30:28 -0700220 }
221}
222
Naseer Ahmed54821fe2012-11-28 18:44:38 -0500223bool isSecuring(hwc_context_t* ctx) {
224 if((ctx->mMDP.version < qdutils::MDSS_V5) &&
225 (ctx->mMDP.version > qdutils::MDP_V3_0) &&
226 ctx->mSecuring) {
227 return true;
228 }
229 return false;
230}
231
Sushil Chauhan2515abf2013-01-08 16:40:05 -0800232bool isSecureModePolicy(int mdpVersion) {
233 if (mdpVersion < qdutils::MDSS_V5)
234 return true;
235 else
236 return false;
237}
Naseer Ahmed54821fe2012-11-28 18:44:38 -0500238
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700239//Crops source buffer against destination and FB boundaries
240void calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
Saurabh Shah27c1d652012-08-14 19:30:28 -0700241 const int fbWidth, const int fbHeight, int orient) {
242 int& crop_l = crop.left;
243 int& crop_t = crop.top;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700244 int& crop_r = crop.right;
245 int& crop_b = crop.bottom;
246 int crop_w = crop.right - crop.left;
247 int crop_h = crop.bottom - crop.top;
248
Saurabh Shah27c1d652012-08-14 19:30:28 -0700249 int& dst_l = dst.left;
250 int& dst_t = dst.top;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700251 int& dst_r = dst.right;
252 int& dst_b = dst.bottom;
Saurabh Shah27c1d652012-08-14 19:30:28 -0700253 int dst_w = abs(dst.right - dst.left);
254 int dst_h = abs(dst.bottom - dst.top);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700255
Saurabh Shah541b59d2012-10-11 11:08:12 -0700256 float leftCutRatio = 0.0f, rightCutRatio = 0.0f, topCutRatio = 0.0f,
257 bottomCutRatio = 0.0f;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700258
Saurabh Shah27c1d652012-08-14 19:30:28 -0700259 if(dst_l < 0) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700260 leftCutRatio = (float)(0.0f - dst_l) / (float)dst_w;
Saurabh Shah27c1d652012-08-14 19:30:28 -0700261 dst_l = 0;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700262 }
263 if(dst_r > fbWidth) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700264 rightCutRatio = (float)(dst_r - fbWidth) / (float)dst_w;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700265 dst_r = fbWidth;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700266 }
Saurabh Shah27c1d652012-08-14 19:30:28 -0700267 if(dst_t < 0) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700268 topCutRatio = (float)(0 - dst_t) / (float)dst_h;
Saurabh Shah27c1d652012-08-14 19:30:28 -0700269 dst_t = 0;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700270 }
271 if(dst_b > fbHeight) {
Saurabh Shah541b59d2012-10-11 11:08:12 -0700272 bottomCutRatio = (float)(dst_b - fbHeight) / (float)dst_h;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700273 dst_b = fbHeight;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700274 }
Saurabh Shah27c1d652012-08-14 19:30:28 -0700275
Saurabh Shah541b59d2012-10-11 11:08:12 -0700276 calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient);
277 crop_l += crop_w * leftCutRatio;
278 crop_t += crop_h * topCutRatio;
279 crop_r -= crop_w * rightCutRatio;
280 crop_b -= crop_h * bottomCutRatio;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700281}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700282
Saurabh Shah3e858eb2012-09-17 16:53:21 -0700283bool isExternalActive(hwc_context_t* ctx) {
284 return ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive;
Saurabh Shahfc2acbe2012-08-17 19:47:52 -0700285}
286
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800287int hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy,
288 int fd) {
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700289 int ret = 0;
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700290 struct mdp_buf_sync data;
Naseer Ahmedb1c76322012-10-17 00:32:50 -0400291 int acquireFd[MAX_NUM_LAYERS];
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700292 int count = 0;
293 int releaseFd = -1;
294 int fbFd = -1;
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800295 memset(&data, 0, sizeof(data));
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500296 bool swapzero = false;
Saurabh Shahc4d034f2012-09-27 15:55:15 -0700297 data.flags = MDP_BUF_SYNC_FLAG_WAIT;
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700298 data.acq_fen_fd = acquireFd;
299 data.rel_fen_fd = &releaseFd;
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500300 char property[PROPERTY_VALUE_MAX];
301 if(property_get("debug.egl.swapinterval", property, "1") > 0) {
302 if(atoi(property) == 0)
303 swapzero = true;
304 }
305
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700306 //Accumulate acquireFenceFds
307 for(uint32_t i = 0; i < list->numHwLayers; i++) {
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800308 if(list->hwLayers[i].compositionType == HWC_OVERLAY &&
309 list->hwLayers[i].acquireFenceFd != -1) {
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500310 if(UNLIKELY(swapzero))
311 acquireFd[count++] = -1;
312 else
313 acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700314 }
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800315 if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
316 if(UNLIKELY(swapzero))
317 acquireFd[count++] = -1;
318 else if(fd != -1) {
319 //set the acquireFD from fd - which is coming from c2d
320 acquireFd[count++] = fd;
321 // Buffer sync IOCTL should be async when using c2d fence is
322 // used
323 data.flags &= ~MDP_BUF_SYNC_FLAG_WAIT;
324 } else if(list->hwLayers[i].acquireFenceFd != -1)
325 acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
326 }
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700327 }
328
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700329 data.acq_fen_fd_cnt = count;
330 fbFd = ctx->dpyAttr[dpy].fd;
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700331 //Waits for acquire fences, returns a release fence
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800332 if(LIKELY(!swapzero)) {
333 uint64_t start = systemTime();
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500334 ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data);
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800335 ALOGD_IF(HWC_UTILS_DEBUG, "%s: time taken for MSMFB_BUFFER_SYNC IOCTL = %d",
336 __FUNCTION__, (size_t) ns2ms(systemTime() - start));
337 }
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700338 if(ret < 0) {
339 ALOGE("ioctl MSMFB_BUFFER_SYNC failed, err=%s",
340 strerror(errno));
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700341 }
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700342 for(uint32_t i = 0; i < list->numHwLayers; i++) {
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800343 if(list->hwLayers[i].compositionType == HWC_OVERLAY ||
344 list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700345 //Close the acquireFenceFds
346 if(list->hwLayers[i].acquireFenceFd > 0) {
347 close(list->hwLayers[i].acquireFenceFd);
348 list->hwLayers[i].acquireFenceFd = -1;
349 }
Arun Kumar K.R361da4f2012-11-28 10:42:59 -0800350 if(fd > 0) {
351 close(fd);
352 fd = -1;
353 }
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700354 //Populate releaseFenceFds.
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500355 if(UNLIKELY(swapzero))
356 list->hwLayers[i].releaseFenceFd = -1;
357 else
358 list->hwLayers[i].releaseFenceFd = dup(releaseFd);
Kinjal Bhavsar40a1cc52012-10-10 15:52:03 -0700359 }
360 }
Naseer Ahmed94baddc2012-12-17 18:51:01 -0500361 if(UNLIKELY(swapzero)){
362 list->retireFenceFd = -1;
363 close(releaseFd);
364 } else {
365 list->retireFenceFd = releaseFd;
366 }
Kinjal Bhavsar2dd04a82012-09-18 18:27:59 -0700367 return ret;
368}
369
Naseer Ahmedb1c76322012-10-17 00:32:50 -0400370void LayerCache::resetLayerCache(int num) {
371 for(uint32_t i = 0; i < MAX_NUM_LAYERS; i++) {
372 hnd[i] = NULL;
373 }
374 numHwLayers = num;
375}
376
377void LayerCache::updateLayerCache(hwc_display_contents_1_t* list) {
378
379 int numFbLayers = 0;
380 int numCacheableLayers = 0;
381
382 canUseLayerCache = false;
383 //Bail if geometry changed or num of layers changed
384 if(list->flags & HWC_GEOMETRY_CHANGED ||
385 list->numHwLayers != numHwLayers ) {
386 resetLayerCache(list->numHwLayers);
387 return;
388 }
389
390 for(uint32_t i = 0; i < list->numHwLayers; i++) {
391 //Bail on skip layers
392 if(list->hwLayers[i].flags & HWC_SKIP_LAYER) {
393 resetLayerCache(list->numHwLayers);
394 return;
395 }
396
397 if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER) {
398 numFbLayers++;
399 if(hnd[i] == NULL) {
400 hnd[i] = list->hwLayers[i].handle;
401 } else if (hnd[i] ==
402 list->hwLayers[i].handle) {
403 numCacheableLayers++;
404 } else {
405 hnd[i] = NULL;
406 return;
407 }
408 } else {
409 hnd[i] = NULL;
410 }
411 }
412 if(numFbLayers == numCacheableLayers)
413 canUseLayerCache = true;
414
415 //XXX: The marking part is separate, if MDP comp wants
416 // to use it in the future. Right now getting MDP comp
417 // to use this is more trouble than it is worth.
418 markCachedLayersAsOverlay(list);
419}
420
421void LayerCache::markCachedLayersAsOverlay(hwc_display_contents_1_t* list) {
422 //This optimization only works if ALL the layer handles
423 //that were on the framebuffer didn't change.
424 if(canUseLayerCache){
425 for(uint32_t i = 0; i < list->numHwLayers; i++) {
426 if (list->hwLayers[i].handle &&
427 list->hwLayers[i].handle == hnd[i] &&
428 list->hwLayers[i].compositionType != HWC_FRAMEBUFFER_TARGET)
429 {
430 list->hwLayers[i].compositionType = HWC_OVERLAY;
431 }
432 }
433 }
434
435}
436
Naseer Ahmed29a26812012-06-14 00:56:20 -0700437};//namespace