• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18 
19 #include <inttypes.h>
20 #include <math.h>
21 #include <stdint.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/types.h>
26 
27 #include <utils/Errors.h>
28 #include <utils/misc.h>
29 #include <utils/NativeHandle.h>
30 #include <utils/String8.h>
31 #include <utils/Thread.h>
32 #include <utils/Trace.h>
33 #include <utils/Vector.h>
34 
35 #include <ui/GraphicBuffer.h>
36 
37 #include <hardware/hardware.h>
38 #include <hardware/hwcomposer.h>
39 
40 #include <android/configuration.h>
41 
42 #include <cutils/properties.h>
43 #include <log/log.h>
44 
45 #include <system/graphics.h>
46 
47 #include "HWComposer.h"
48 
49 #include "../Layer.h"           // needed only for debugging
50 #include "../SurfaceFlinger.h"
51 
52 namespace android {
53 
54 #define MIN_HWC_HEADER_VERSION HWC_HEADER_VERSION
55 
hwcApiVersion(const hwc_composer_device_1_t * hwc)56 static uint32_t hwcApiVersion(const hwc_composer_device_1_t* hwc) {
57     uint32_t hwcVersion = hwc->common.version;
58     return hwcVersion & HARDWARE_API_VERSION_2_MAJ_MIN_MASK;
59 }
60 
hwcHeaderVersion(const hwc_composer_device_1_t * hwc)61 static uint32_t hwcHeaderVersion(const hwc_composer_device_1_t* hwc) {
62     uint32_t hwcVersion = hwc->common.version;
63     return hwcVersion & HARDWARE_API_VERSION_2_HEADER_MASK;
64 }
65 
hwcHasApiVersion(const hwc_composer_device_1_t * hwc,uint32_t version)66 static bool hwcHasApiVersion(const hwc_composer_device_1_t* hwc,
67         uint32_t version) {
68     return hwcApiVersion(hwc) >= (version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK);
69 }
70 
71 // ---------------------------------------------------------------------------
72 
73 struct HWComposer::cb_context {
74     struct callbacks : public hwc_procs_t {
75         // these are here to facilitate the transition when adding
76         // new callbacks (an implementation can check for NULL before
77         // calling a new callback).
78         void (*zero[4])(void);
79     };
80     callbacks procs;
81     HWComposer* hwc;
82 };
83 
84 // ---------------------------------------------------------------------------
85 
HWComposer(const sp<SurfaceFlinger> & flinger,EventHandler & handler)86 HWComposer::HWComposer(
87         const sp<SurfaceFlinger>& flinger,
88         EventHandler& handler)
89     : mFlinger(flinger),
90       mFbDev(0), mHwc(0), mNumDisplays(1),
91       mCBContext(new cb_context),
92       mEventHandler(handler),
93       mDebugForceFakeVSync(false)
94 {
95     for (size_t i =0 ; i<MAX_HWC_DISPLAYS ; i++) {
96         mLists[i] = 0;
97     }
98 
99     for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) {
100         mLastHwVSync[i] = 0;
101         mVSyncCounts[i] = 0;
102     }
103 
104     char value[PROPERTY_VALUE_MAX];
105     property_get("debug.sf.no_hw_vsync", value, "0");
106     mDebugForceFakeVSync = atoi(value);
107 
108     bool needVSyncThread = true;
109 
110     // Note: some devices may insist that the FB HAL be opened before HWC.
111     int fberr = loadFbHalModule();
112     loadHwcModule();
113 
114     if (mFbDev && mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
115         // close FB HAL if we don't needed it.
116         // FIXME: this is temporary until we're not forced to open FB HAL
117         // before HWC.
118         framebuffer_close(mFbDev);
119         mFbDev = NULL;
120     }
121 
122     // If we have no HWC, or a pre-1.1 HWC, an FB dev is mandatory.
123     if ((!mHwc || !hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1))
124             && !mFbDev) {
125         ALOGE("ERROR: failed to open framebuffer (%s), aborting",
126                 strerror(-fberr));
127         abort();
128     }
129 
130     // these display IDs are always reserved
131     for (size_t i=0 ; i<NUM_BUILTIN_DISPLAYS ; i++) {
132         mAllocatedDisplayIDs.markBit(i);
133     }
134 
135     if (mHwc) {
136         ALOGI("Using %s version %u.%u", HWC_HARDWARE_COMPOSER,
137               (hwcApiVersion(mHwc) >> 24) & 0xff,
138               (hwcApiVersion(mHwc) >> 16) & 0xff);
139         if (mHwc->registerProcs) {
140             mCBContext->hwc = this;
141             mCBContext->procs.invalidate = &hook_invalidate;
142             mCBContext->procs.vsync = &hook_vsync;
143             if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1))
144                 mCBContext->procs.hotplug = &hook_hotplug;
145             else
146                 mCBContext->procs.hotplug = NULL;
147             memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero));
148             mHwc->registerProcs(mHwc, &mCBContext->procs);
149         }
150 
151         // don't need a vsync thread if we have a hardware composer
152         needVSyncThread = false;
153         // always turn vsync off when we start
154         eventControl(HWC_DISPLAY_PRIMARY, HWC_EVENT_VSYNC, 0);
155 
156         // the number of displays we actually have depends on the
157         // hw composer version
158         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) {
159             // 1.3 adds support for virtual displays
160             mNumDisplays = MAX_HWC_DISPLAYS;
161         } else if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
162             // 1.1 adds support for multiple displays
163             mNumDisplays = NUM_BUILTIN_DISPLAYS;
164         } else {
165             mNumDisplays = 1;
166         }
167     }
168 
169     if (mFbDev) {
170         ALOG_ASSERT(!(mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)),
171                 "should only have fbdev if no hwc or hwc is 1.0");
172 
173         DisplayData& disp(mDisplayData[HWC_DISPLAY_PRIMARY]);
174         disp.connected = true;
175         disp.format = mFbDev->format;
176         DisplayConfig config = DisplayConfig();
177         config.width = mFbDev->width;
178         config.height = mFbDev->height;
179         config.xdpi = mFbDev->xdpi;
180         config.ydpi = mFbDev->ydpi;
181         config.refresh = nsecs_t(1e9 / mFbDev->fps);
182         disp.configs.push_back(config);
183         disp.currentConfig = 0;
184     } else if (mHwc) {
185         // here we're guaranteed to have at least HWC 1.1
186         for (size_t i =0 ; i<NUM_BUILTIN_DISPLAYS ; i++) {
187             queryDisplayProperties(i);
188         }
189     }
190 
191     if (needVSyncThread) {
192         // we don't have VSYNC support, we need to fake it
193         mVSyncThread = new VSyncThread(*this);
194     }
195 }
196 
~HWComposer()197 HWComposer::~HWComposer() {
198     if (mHwc) {
199         eventControl(HWC_DISPLAY_PRIMARY, HWC_EVENT_VSYNC, 0);
200     }
201     if (mVSyncThread != NULL) {
202         mVSyncThread->requestExitAndWait();
203     }
204     if (mHwc) {
205         hwc_close_1(mHwc);
206     }
207     if (mFbDev) {
208         framebuffer_close(mFbDev);
209     }
210     delete mCBContext;
211 }
212 
213 // Load and prepare the hardware composer module.  Sets mHwc.
loadHwcModule()214 void HWComposer::loadHwcModule()
215 {
216     hw_module_t const* module;
217 
218     if (hw_get_module(HWC_HARDWARE_MODULE_ID, &module) != 0) {
219         ALOGE("%s module not found", HWC_HARDWARE_MODULE_ID);
220         return;
221     }
222 
223     int err = hwc_open_1(module, &mHwc);
224     if (err) {
225         ALOGE("%s device failed to initialize (%s)",
226               HWC_HARDWARE_COMPOSER, strerror(-err));
227         return;
228     }
229 
230     if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_0) ||
231             hwcHeaderVersion(mHwc) < MIN_HWC_HEADER_VERSION ||
232             hwcHeaderVersion(mHwc) > HWC_HEADER_VERSION) {
233         ALOGE("%s device version %#x unsupported, will not be used",
234               HWC_HARDWARE_COMPOSER, mHwc->common.version);
235         hwc_close_1(mHwc);
236         mHwc = NULL;
237         return;
238     }
239 }
240 
241 // Load and prepare the FB HAL, which uses the gralloc module.  Sets mFbDev.
loadFbHalModule()242 int HWComposer::loadFbHalModule()
243 {
244     hw_module_t const* module;
245 
246     int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
247     if (err != 0) {
248         ALOGE("%s module not found", GRALLOC_HARDWARE_MODULE_ID);
249         return err;
250     }
251 
252     return framebuffer_open(module, &mFbDev);
253 }
254 
initCheck() const255 status_t HWComposer::initCheck() const {
256     return mHwc ? NO_ERROR : NO_INIT;
257 }
258 
hook_invalidate(const struct hwc_procs * procs)259 void HWComposer::hook_invalidate(const struct hwc_procs* procs) {
260     cb_context* ctx = reinterpret_cast<cb_context*>(
261             const_cast<hwc_procs_t*>(procs));
262     ctx->hwc->invalidate();
263 }
264 
hook_vsync(const struct hwc_procs * procs,int disp,int64_t timestamp)265 void HWComposer::hook_vsync(const struct hwc_procs* procs, int disp,
266         int64_t timestamp) {
267     cb_context* ctx = reinterpret_cast<cb_context*>(
268             const_cast<hwc_procs_t*>(procs));
269     ctx->hwc->vsync(disp, timestamp);
270 }
271 
hook_hotplug(const struct hwc_procs * procs,int disp,int connected)272 void HWComposer::hook_hotplug(const struct hwc_procs* procs, int disp,
273         int connected) {
274     cb_context* ctx = reinterpret_cast<cb_context*>(
275             const_cast<hwc_procs_t*>(procs));
276     ctx->hwc->hotplug(disp, connected);
277 }
278 
invalidate()279 void HWComposer::invalidate() {
280     mEventHandler.onInvalidateReceived(this);
281 }
282 
vsync(int disp,int64_t timestamp)283 void HWComposer::vsync(int disp, int64_t timestamp) {
284     if (uint32_t(disp) < HWC_NUM_PHYSICAL_DISPLAY_TYPES) {
285         {
286             Mutex::Autolock _l(mLock);
287 
288             // There have been reports of HWCs that signal several vsync events
289             // with the same timestamp when turning the display off and on. This
290             // is a bug in the HWC implementation, but filter the extra events
291             // out here so they don't cause havoc downstream.
292             if (timestamp == mLastHwVSync[disp]) {
293                 ALOGW("Ignoring duplicate VSYNC event from HWC (t=%" PRId64 ")",
294                         timestamp);
295                 return;
296             }
297 
298             mLastHwVSync[disp] = timestamp;
299         }
300 
301         char tag[16];
302         snprintf(tag, sizeof(tag), "HW_VSYNC_%1u", disp);
303         ATRACE_INT(tag, ++mVSyncCounts[disp] & 1);
304 
305         mEventHandler.onVSyncReceived(this, disp, timestamp);
306     }
307 }
308 
hotplug(int disp,int connected)309 void HWComposer::hotplug(int disp, int connected) {
310     if (disp >= VIRTUAL_DISPLAY_ID_BASE) {
311         ALOGE("hotplug event received for invalid display: disp=%d connected=%d",
312                 disp, connected);
313         return;
314     }
315     queryDisplayProperties(disp);
316     // Do not teardown or recreate the primary display
317     if (disp != HWC_DISPLAY_PRIMARY) {
318         mEventHandler.onHotplugReceived(this, disp, bool(connected));
319     }
320 }
321 
getDefaultDensity(uint32_t width,uint32_t height)322 static float getDefaultDensity(uint32_t width, uint32_t height) {
323     // Default density is based on TVs: 1080p displays get XHIGH density,
324     // lower-resolution displays get TV density. Maybe eventually we'll need
325     // to update it for 4K displays, though hopefully those just report
326     // accurate DPI information to begin with. This is also used for virtual
327     // displays and even primary displays with older hwcomposers, so be
328     // careful about orientation.
329 
330     uint32_t h = width < height ? width : height;
331     if (h >= 1080) return ACONFIGURATION_DENSITY_XHIGH;
332     else           return ACONFIGURATION_DENSITY_TV;
333 }
334 
335 static const uint32_t DISPLAY_ATTRIBUTES[] = {
336     HWC_DISPLAY_VSYNC_PERIOD,
337     HWC_DISPLAY_WIDTH,
338     HWC_DISPLAY_HEIGHT,
339     HWC_DISPLAY_DPI_X,
340     HWC_DISPLAY_DPI_Y,
341     HWC_DISPLAY_COLOR_TRANSFORM,
342     HWC_DISPLAY_NO_ATTRIBUTE,
343 };
344 #define NUM_DISPLAY_ATTRIBUTES (sizeof(DISPLAY_ATTRIBUTES) / sizeof(DISPLAY_ATTRIBUTES)[0])
345 
346 static const uint32_t PRE_HWC15_DISPLAY_ATTRIBUTES[] = {
347     HWC_DISPLAY_VSYNC_PERIOD,
348     HWC_DISPLAY_WIDTH,
349     HWC_DISPLAY_HEIGHT,
350     HWC_DISPLAY_DPI_X,
351     HWC_DISPLAY_DPI_Y,
352     HWC_DISPLAY_NO_ATTRIBUTE,
353 };
354 
queryDisplayProperties(int disp)355 status_t HWComposer::queryDisplayProperties(int disp) {
356 
357     LOG_ALWAYS_FATAL_IF(!mHwc || !hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1));
358 
359     // use zero as default value for unspecified attributes
360     int32_t values[NUM_DISPLAY_ATTRIBUTES - 1];
361     memset(values, 0, sizeof(values));
362 
363     const size_t MAX_NUM_CONFIGS = 128;
364     uint32_t configs[MAX_NUM_CONFIGS] = {0};
365     size_t numConfigs = MAX_NUM_CONFIGS;
366     status_t err = mHwc->getDisplayConfigs(mHwc, disp, configs, &numConfigs);
367     if (err != NO_ERROR) {
368         // this can happen if an unpluggable display is not connected
369         mDisplayData[disp].connected = false;
370         return err;
371     }
372 
373     mDisplayData[disp].currentConfig = 0;
374     for (size_t c = 0; c < numConfigs; ++c) {
375         err = mHwc->getDisplayAttributes(mHwc, disp, configs[c],
376                 DISPLAY_ATTRIBUTES, values);
377         // If this is a pre-1.5 HWC, it may not know about color transform, so
378         // try again with a smaller set of attributes
379         if (err != NO_ERROR) {
380             err = mHwc->getDisplayAttributes(mHwc, disp, configs[c],
381                     PRE_HWC15_DISPLAY_ATTRIBUTES, values);
382         }
383         if (err != NO_ERROR) {
384             // we can't get this display's info. turn it off.
385             mDisplayData[disp].connected = false;
386             return err;
387         }
388 
389         DisplayConfig config = DisplayConfig();
390         for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
391             switch (DISPLAY_ATTRIBUTES[i]) {
392                 case HWC_DISPLAY_VSYNC_PERIOD:
393                     config.refresh = nsecs_t(values[i]);
394                     break;
395                 case HWC_DISPLAY_WIDTH:
396                     config.width = values[i];
397                     break;
398                 case HWC_DISPLAY_HEIGHT:
399                     config.height = values[i];
400                     break;
401                 case HWC_DISPLAY_DPI_X:
402                     config.xdpi = values[i] / 1000.0f;
403                     break;
404                 case HWC_DISPLAY_DPI_Y:
405                     config.ydpi = values[i] / 1000.0f;
406                     break;
407                 case HWC_DISPLAY_COLOR_TRANSFORM:
408                     config.colorMode = static_cast<android_color_mode_t>(values[i]);
409                     break;
410                 default:
411                     ALOG_ASSERT(false, "unknown display attribute[%zu] %#x",
412                             i, DISPLAY_ATTRIBUTES[i]);
413                     break;
414             }
415         }
416 
417         if (config.xdpi == 0.0f || config.ydpi == 0.0f) {
418             float dpi = getDefaultDensity(config.width, config.height);
419             config.xdpi = dpi;
420             config.ydpi = dpi;
421         }
422 
423         mDisplayData[disp].configs.push_back(config);
424     }
425 
426     // FIXME: what should we set the format to?
427     mDisplayData[disp].format = HAL_PIXEL_FORMAT_RGBA_8888;
428     mDisplayData[disp].connected = true;
429     return NO_ERROR;
430 }
431 
setVirtualDisplayProperties(int32_t id,uint32_t w,uint32_t h,uint32_t format)432 status_t HWComposer::setVirtualDisplayProperties(int32_t id,
433         uint32_t w, uint32_t h, uint32_t format) {
434     if (id < VIRTUAL_DISPLAY_ID_BASE || id >= int32_t(mNumDisplays) ||
435             !mAllocatedDisplayIDs.hasBit(id)) {
436         return BAD_INDEX;
437     }
438     size_t configId = mDisplayData[id].currentConfig;
439     mDisplayData[id].format = format;
440     DisplayConfig& config = mDisplayData[id].configs.editItemAt(configId);
441     config.width = w;
442     config.height = h;
443     config.xdpi = config.ydpi = getDefaultDensity(w, h);
444     return NO_ERROR;
445 }
446 
allocateDisplayId()447 int32_t HWComposer::allocateDisplayId() {
448     if (mAllocatedDisplayIDs.count() >= mNumDisplays) {
449         return NO_MEMORY;
450     }
451     int32_t id = mAllocatedDisplayIDs.firstUnmarkedBit();
452     mAllocatedDisplayIDs.markBit(id);
453     mDisplayData[id].connected = true;
454     mDisplayData[id].configs.resize(1);
455     mDisplayData[id].currentConfig = 0;
456     return id;
457 }
458 
freeDisplayId(int32_t id)459 status_t HWComposer::freeDisplayId(int32_t id) {
460     if (id < NUM_BUILTIN_DISPLAYS) {
461         // cannot free the reserved IDs
462         return BAD_VALUE;
463     }
464     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) {
465         return BAD_INDEX;
466     }
467     mAllocatedDisplayIDs.clearBit(id);
468     mDisplayData[id].connected = false;
469     return NO_ERROR;
470 }
471 
getRefreshTimestamp(int disp) const472 nsecs_t HWComposer::getRefreshTimestamp(int disp) const {
473     // this returns the last refresh timestamp.
474     // if the last one is not available, we estimate it based on
475     // the refresh period and whatever closest timestamp we have.
476     Mutex::Autolock _l(mLock);
477     nsecs_t now = systemTime(CLOCK_MONOTONIC);
478     size_t configId = mDisplayData[disp].currentConfig;
479     return now - ((now - mLastHwVSync[disp]) %
480             mDisplayData[disp].configs[configId].refresh);
481 }
482 
getDisplayFence(int disp) const483 sp<Fence> HWComposer::getDisplayFence(int disp) const {
484     return mDisplayData[disp].lastDisplayFence;
485 }
486 
getFormat(int disp) const487 uint32_t HWComposer::getFormat(int disp) const {
488     if (static_cast<uint32_t>(disp) >= MAX_HWC_DISPLAYS || !mAllocatedDisplayIDs.hasBit(disp)) {
489         return HAL_PIXEL_FORMAT_RGBA_8888;
490     } else {
491         return mDisplayData[disp].format;
492     }
493 }
494 
isConnected(int disp) const495 bool HWComposer::isConnected(int disp) const {
496     return mDisplayData[disp].connected;
497 }
498 
getWidth(int disp) const499 uint32_t HWComposer::getWidth(int disp) const {
500     size_t currentConfig = mDisplayData[disp].currentConfig;
501     return mDisplayData[disp].configs[currentConfig].width;
502 }
503 
getHeight(int disp) const504 uint32_t HWComposer::getHeight(int disp) const {
505     size_t currentConfig = mDisplayData[disp].currentConfig;
506     return mDisplayData[disp].configs[currentConfig].height;
507 }
508 
getDpiX(int disp) const509 float HWComposer::getDpiX(int disp) const {
510     size_t currentConfig = mDisplayData[disp].currentConfig;
511     return mDisplayData[disp].configs[currentConfig].xdpi;
512 }
513 
getDpiY(int disp) const514 float HWComposer::getDpiY(int disp) const {
515     size_t currentConfig = mDisplayData[disp].currentConfig;
516     return mDisplayData[disp].configs[currentConfig].ydpi;
517 }
518 
getRefreshPeriod(int disp) const519 nsecs_t HWComposer::getRefreshPeriod(int disp) const {
520     size_t currentConfig = mDisplayData[disp].currentConfig;
521     return mDisplayData[disp].configs[currentConfig].refresh;
522 }
523 
getColorMode(int disp) const524 android_color_mode_t HWComposer::getColorMode(int disp) const {
525     size_t currentConfig = mDisplayData[disp].currentConfig;
526     return mDisplayData[disp].configs[currentConfig].colorMode;
527 }
528 
getConfigs(int disp) const529 const Vector<HWComposer::DisplayConfig>& HWComposer::getConfigs(int disp) const {
530     return mDisplayData[disp].configs;
531 }
532 
getCurrentConfig(int disp) const533 size_t HWComposer::getCurrentConfig(int disp) const {
534     return mDisplayData[disp].currentConfig;
535 }
536 
eventControl(int disp,int event,int enabled)537 void HWComposer::eventControl(int disp, int event, int enabled) {
538     if (uint32_t(disp)>31 || !mAllocatedDisplayIDs.hasBit(disp)) {
539         ALOGD("eventControl ignoring event %d on unallocated disp %d (en=%d)",
540               event, disp, enabled);
541         return;
542     }
543     if (event != EVENT_VSYNC) {
544         ALOGW("eventControl got unexpected event %d (disp=%d en=%d)",
545               event, disp, enabled);
546         return;
547     }
548     status_t err = NO_ERROR;
549     if (mHwc && !mDebugForceFakeVSync) {
550         // NOTE: we use our own internal lock here because we have to call
551         // into the HWC with the lock held, and we want to make sure
552         // that even if HWC blocks (which it shouldn't), it won't
553         // affect other threads.
554         Mutex::Autolock _l(mEventControlLock);
555         const int32_t eventBit = 1UL << event;
556         const int32_t newValue = enabled ? eventBit : 0;
557         const int32_t oldValue = mDisplayData[disp].events & eventBit;
558         if (newValue != oldValue) {
559             ATRACE_CALL();
560             err = mHwc->eventControl(mHwc, disp, event, enabled);
561             if (!err) {
562                 int32_t& events(mDisplayData[disp].events);
563                 events = (events & ~eventBit) | newValue;
564 
565                 char tag[16];
566                 snprintf(tag, sizeof(tag), "HW_VSYNC_ON_%1u", disp);
567                 ATRACE_INT(tag, enabled);
568             }
569         }
570         // error here should not happen -- not sure what we should
571         // do if it does.
572         ALOGE_IF(err, "eventControl(%d, %d) failed %s",
573                 event, enabled, strerror(-err));
574     }
575 
576     if (err == NO_ERROR && mVSyncThread != NULL) {
577         mVSyncThread->setEnabled(enabled);
578     }
579 }
580 
createWorkList(int32_t id,size_t numLayers)581 status_t HWComposer::createWorkList(int32_t id, size_t numLayers) {
582     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) {
583         return BAD_INDEX;
584     }
585 
586     if (mHwc) {
587         DisplayData& disp(mDisplayData[id]);
588         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
589             // we need space for the HWC_FRAMEBUFFER_TARGET
590             numLayers++;
591         }
592         if (disp.capacity < numLayers || disp.list == NULL) {
593             size_t size = sizeof(hwc_display_contents_1_t)
594                     + numLayers * sizeof(hwc_layer_1_t);
595             free(disp.list);
596             disp.list = (hwc_display_contents_1_t*)malloc(size);
597             disp.capacity = numLayers;
598         }
599         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
600             disp.framebufferTarget = &disp.list->hwLayers[numLayers - 1];
601             memset(disp.framebufferTarget, 0, sizeof(hwc_layer_1_t));
602             const DisplayConfig& currentConfig =
603                     disp.configs[disp.currentConfig];
604             const hwc_rect_t r = { 0, 0,
605                     (int) currentConfig.width, (int) currentConfig.height };
606             disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET;
607             disp.framebufferTarget->hints = 0;
608             disp.framebufferTarget->flags = 0;
609             disp.framebufferTarget->handle = disp.fbTargetHandle;
610             disp.framebufferTarget->transform = 0;
611             disp.framebufferTarget->blending = HWC_BLENDING_PREMULT;
612             if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) {
613                 disp.framebufferTarget->sourceCropf.left = 0;
614                 disp.framebufferTarget->sourceCropf.top = 0;
615                 disp.framebufferTarget->sourceCropf.right =
616                         currentConfig.width;
617                 disp.framebufferTarget->sourceCropf.bottom =
618                         currentConfig.height;
619             } else {
620                 disp.framebufferTarget->sourceCrop = r;
621             }
622             disp.framebufferTarget->displayFrame = r;
623             disp.framebufferTarget->visibleRegionScreen.numRects = 1;
624             disp.framebufferTarget->visibleRegionScreen.rects =
625                 &disp.framebufferTarget->displayFrame;
626             disp.framebufferTarget->acquireFenceFd = -1;
627             disp.framebufferTarget->releaseFenceFd = -1;
628             disp.framebufferTarget->planeAlpha = 0xFF;
629         }
630         disp.list->retireFenceFd = -1;
631         disp.list->flags = HWC_GEOMETRY_CHANGED;
632         disp.list->numHwLayers = numLayers;
633     }
634     return NO_ERROR;
635 }
636 
setFramebufferTarget(int32_t id,const sp<Fence> & acquireFence,const sp<GraphicBuffer> & buf)637 status_t HWComposer::setFramebufferTarget(int32_t id,
638         const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buf) {
639     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) {
640         return BAD_INDEX;
641     }
642     DisplayData& disp(mDisplayData[id]);
643     if (!disp.framebufferTarget) {
644         // this should never happen, but apparently eglCreateWindowSurface()
645         // triggers a Surface::queueBuffer()  on some
646         // devices (!?) -- log and ignore.
647         ALOGE("HWComposer: framebufferTarget is null");
648         return NO_ERROR;
649     }
650 
651     int acquireFenceFd = -1;
652     if (acquireFence->isValid()) {
653         acquireFenceFd = acquireFence->dup();
654     }
655 
656     // ALOGD("fbPost: handle=%p, fence=%d", buf->handle, acquireFenceFd);
657     disp.fbTargetHandle = buf->handle;
658     disp.framebufferTarget->handle = disp.fbTargetHandle;
659     disp.framebufferTarget->acquireFenceFd = acquireFenceFd;
660     return NO_ERROR;
661 }
662 
prepare()663 status_t HWComposer::prepare() {
664     Mutex::Autolock _l(mDisplayLock);
665     for (size_t i=0 ; i<mNumDisplays ; i++) {
666         DisplayData& disp(mDisplayData[i]);
667         if (disp.framebufferTarget) {
668             // make sure to reset the type to HWC_FRAMEBUFFER_TARGET
669             // DO NOT reset the handle field to NULL, because it's possible
670             // that we have nothing to redraw (eg: eglSwapBuffers() not called)
671             // in which case, we should continue to use the same buffer.
672             LOG_FATAL_IF(disp.list == NULL);
673             disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET;
674         }
675         if (!disp.connected && disp.list != NULL) {
676             ALOGW("WARNING: disp %zu: connected, non-null list, layers=%zu",
677                   i, disp.list->numHwLayers);
678         }
679         mLists[i] = disp.list;
680         if (mLists[i]) {
681             if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) {
682                 mLists[i]->outbuf = disp.outbufHandle;
683                 mLists[i]->outbufAcquireFenceFd = -1;
684             } else if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
685                 // garbage data to catch improper use
686                 mLists[i]->dpy = (hwc_display_t)0xDEADBEEF;
687                 mLists[i]->sur = (hwc_surface_t)0xDEADBEEF;
688             } else {
689                 mLists[i]->dpy = EGL_NO_DISPLAY;
690                 mLists[i]->sur = EGL_NO_SURFACE;
691             }
692         }
693     }
694 
695     int err = mHwc->prepare(mHwc, mNumDisplays, mLists);
696     ALOGE_IF(err, "HWComposer: prepare failed (%s)", strerror(-err));
697 
698     if (err == NO_ERROR) {
699         // here we're just making sure that "skip" layers are set
700         // to HWC_FRAMEBUFFER and we're also counting how many layers
701         // we have of each type.
702         //
703         // If there are no window layers, we treat the display has having FB
704         // composition, because SurfaceFlinger will use GLES to draw the
705         // wormhole region.
706         for (size_t i=0 ; i<mNumDisplays ; i++) {
707             DisplayData& disp(mDisplayData[i]);
708             disp.hasFbComp = false;
709             disp.hasOvComp = false;
710             if (disp.list) {
711                 for (size_t i=0 ; i<disp.list->numHwLayers ; i++) {
712                     hwc_layer_1_t& l = disp.list->hwLayers[i];
713 
714                     //ALOGD("prepare: %d, type=%d, handle=%p",
715                     //        i, l.compositionType, l.handle);
716 
717                     if (l.flags & HWC_SKIP_LAYER) {
718                         l.compositionType = HWC_FRAMEBUFFER;
719                     }
720                     if (l.compositionType == HWC_FRAMEBUFFER) {
721                         disp.hasFbComp = true;
722                     }
723                     if (l.compositionType == HWC_OVERLAY) {
724                         disp.hasOvComp = true;
725                     }
726                     if (l.compositionType == HWC_CURSOR_OVERLAY) {
727                         disp.hasOvComp = true;
728                     }
729                 }
730                 if (disp.list->numHwLayers == (disp.framebufferTarget ? 1 : 0)) {
731                     disp.hasFbComp = true;
732                 }
733             } else {
734                 disp.hasFbComp = true;
735             }
736         }
737     }
738     return (status_t)err;
739 }
740 
hasHwcComposition(int32_t id) const741 bool HWComposer::hasHwcComposition(int32_t id) const {
742     if (!mHwc || uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id))
743         return false;
744     return mDisplayData[id].hasOvComp;
745 }
746 
hasGlesComposition(int32_t id) const747 bool HWComposer::hasGlesComposition(int32_t id) const {
748     if (!mHwc || uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id))
749         return true;
750     return mDisplayData[id].hasFbComp;
751 }
752 
getAndResetReleaseFence(int32_t id)753 sp<Fence> HWComposer::getAndResetReleaseFence(int32_t id) {
754     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id))
755         return Fence::NO_FENCE;
756 
757     int fd = INVALID_OPERATION;
758     if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
759         const DisplayData& disp(mDisplayData[id]);
760         if (disp.framebufferTarget) {
761             fd = disp.framebufferTarget->releaseFenceFd;
762             disp.framebufferTarget->acquireFenceFd = -1;
763             disp.framebufferTarget->releaseFenceFd = -1;
764         }
765     }
766     return fd >= 0 ? new Fence(fd) : Fence::NO_FENCE;
767 }
768 
commit()769 status_t HWComposer::commit() {
770     int err = NO_ERROR;
771     if (mHwc) {
772         if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
773             // On version 1.0, the OpenGL ES target surface is communicated
774             // by the (dpy, sur) fields and we are guaranteed to have only
775             // a single display.
776             mLists[0]->dpy = eglGetCurrentDisplay();
777             mLists[0]->sur = eglGetCurrentSurface(EGL_DRAW);
778         }
779 
780         for (size_t i=VIRTUAL_DISPLAY_ID_BASE; i<mNumDisplays; i++) {
781             DisplayData& disp(mDisplayData[i]);
782             if (disp.outbufHandle) {
783                 mLists[i]->outbuf = disp.outbufHandle;
784                 mLists[i]->outbufAcquireFenceFd =
785                         disp.outbufAcquireFence->dup();
786             }
787         }
788 
789         err = mHwc->set(mHwc, mNumDisplays, mLists);
790 
791         for (size_t i=0 ; i<mNumDisplays ; i++) {
792             DisplayData& disp(mDisplayData[i]);
793             disp.lastDisplayFence = disp.lastRetireFence;
794             disp.lastRetireFence = Fence::NO_FENCE;
795             if (disp.list) {
796                 if (disp.list->retireFenceFd != -1) {
797                     disp.lastRetireFence = new Fence(disp.list->retireFenceFd);
798                     disp.list->retireFenceFd = -1;
799                 }
800                 disp.list->flags &= ~HWC_GEOMETRY_CHANGED;
801             }
802         }
803     }
804     return (status_t)err;
805 }
806 
setPowerMode(int disp,int mode)807 status_t HWComposer::setPowerMode(int disp, int mode) {
808     LOG_FATAL_IF(disp >= VIRTUAL_DISPLAY_ID_BASE);
809     if (mHwc) {
810         if (mode == HWC_POWER_MODE_OFF) {
811             eventControl(disp, HWC_EVENT_VSYNC, 0);
812         }
813         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) {
814             return (status_t)mHwc->setPowerMode(mHwc, disp, mode);
815         } else {
816             return (status_t)mHwc->blank(mHwc, disp,
817                     mode == HWC_POWER_MODE_OFF ? 1 : 0);
818         }
819     }
820     return NO_ERROR;
821 }
822 
setActiveConfig(int disp,int mode)823 status_t HWComposer::setActiveConfig(int disp, int mode) {
824     LOG_FATAL_IF(disp >= VIRTUAL_DISPLAY_ID_BASE);
825     DisplayData& dd(mDisplayData[disp]);
826     dd.currentConfig = mode;
827     if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) {
828         return (status_t)mHwc->setActiveConfig(mHwc, disp, mode);
829     } else {
830         LOG_FATAL_IF(mode != 0);
831     }
832     return NO_ERROR;
833 }
834 
disconnectDisplay(int disp)835 void HWComposer::disconnectDisplay(int disp) {
836     LOG_ALWAYS_FATAL_IF(disp < 0 || disp == HWC_DISPLAY_PRIMARY);
837     DisplayData& dd(mDisplayData[disp]);
838     free(dd.list);
839     dd.list = NULL;
840     dd.framebufferTarget = NULL;    // points into dd.list
841     dd.fbTargetHandle = NULL;
842     dd.outbufHandle = NULL;
843     dd.lastRetireFence = Fence::NO_FENCE;
844     dd.lastDisplayFence = Fence::NO_FENCE;
845     dd.outbufAcquireFence = Fence::NO_FENCE;
846     // clear all the previous configs and repopulate when a new
847     // device is added
848     dd.configs.clear();
849 }
850 
getVisualID() const851 int HWComposer::getVisualID() const {
852     if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
853         // FIXME: temporary hack until HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
854         // is supported by the implementation. we can only be in this case
855         // if we have HWC 1.1
856         return HAL_PIXEL_FORMAT_RGBA_8888;
857         //return HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
858     } else {
859         return mFbDev->format;
860     }
861 }
862 
supportsFramebufferTarget() const863 bool HWComposer::supportsFramebufferTarget() const {
864     return (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1));
865 }
866 
fbPost(int32_t id,const sp<Fence> & acquireFence,const sp<GraphicBuffer> & buffer)867 int HWComposer::fbPost(int32_t id,
868         const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buffer) {
869     if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
870         return setFramebufferTarget(id, acquireFence, buffer);
871     } else {
872         acquireFence->waitForever("HWComposer::fbPost");
873         return mFbDev->post(mFbDev, buffer->handle);
874     }
875 }
876 
fbCompositionComplete()877 int HWComposer::fbCompositionComplete() {
878     if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1))
879         return NO_ERROR;
880 
881     if (mFbDev->compositionComplete) {
882         return mFbDev->compositionComplete(mFbDev);
883     } else {
884         return INVALID_OPERATION;
885     }
886 }
887 
fbDump(String8 & result)888 void HWComposer::fbDump(String8& result) {
889     if (mFbDev && mFbDev->common.version >= 1 && mFbDev->dump) {
890         const size_t SIZE = 4096;
891         char buffer[SIZE];
892         mFbDev->dump(mFbDev, buffer, SIZE);
893         result.append(buffer);
894     }
895 }
896 
setOutputBuffer(int32_t id,const sp<Fence> & acquireFence,const sp<GraphicBuffer> & buf)897 status_t HWComposer::setOutputBuffer(int32_t id, const sp<Fence>& acquireFence,
898         const sp<GraphicBuffer>& buf) {
899     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id))
900         return BAD_INDEX;
901     if (id < VIRTUAL_DISPLAY_ID_BASE)
902         return INVALID_OPERATION;
903 
904     DisplayData& disp(mDisplayData[id]);
905     disp.outbufHandle = buf->handle;
906     disp.outbufAcquireFence = acquireFence;
907     return NO_ERROR;
908 }
909 
getLastRetireFence(int32_t id) const910 sp<Fence> HWComposer::getLastRetireFence(int32_t id) const {
911     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id))
912         return Fence::NO_FENCE;
913     return mDisplayData[id].lastRetireFence;
914 }
915 
setCursorPositionAsync(int32_t id,const Rect & pos)916 status_t HWComposer::setCursorPositionAsync(int32_t id, const Rect& pos)
917 {
918     if (mHwc->setCursorPositionAsync) {
919         return (status_t)mHwc->setCursorPositionAsync(mHwc, id, pos.left, pos.top);
920     }
921     else {
922         return NO_ERROR;
923     }
924 }
925 
926 /*
927  * Helper template to implement a concrete HWCLayer
928  * This holds the pointer to the concrete hwc layer type
929  * and implements the "iterable" side of HWCLayer.
930  */
931 template<typename CONCRETE, typename HWCTYPE>
932 class Iterable : public HWComposer::HWCLayer {
933 protected:
934     HWCTYPE* const mLayerList;
935     HWCTYPE* mCurrentLayer;
Iterable(HWCTYPE * layer)936     explicit Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer),
937             mIndex(0) { }
getLayer() const938     inline HWCTYPE const * getLayer() const { return mCurrentLayer; }
getLayer()939     inline HWCTYPE* getLayer() { return mCurrentLayer; }
~Iterable()940     virtual ~Iterable() { }
941     size_t mIndex;
942 private:
943     // returns a copy of ourselves
dup()944     virtual HWComposer::HWCLayer* dup() {
945         return new CONCRETE( static_cast<const CONCRETE&>(*this) );
946     }
setLayer(size_t index)947     virtual status_t setLayer(size_t index) {
948         mIndex = index;
949         mCurrentLayer = &mLayerList[index];
950         return NO_ERROR;
951     }
952 };
953 
954 /*
955  * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0.
956  * This implements the HWCLayer side of HWCIterableLayer.
957  */
958 class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> {
959     struct hwc_composer_device_1* mHwc;
960 public:
HWCLayerVersion1(struct hwc_composer_device_1 * hwc,hwc_layer_1_t * layer,Vector<Region> * visibleRegions,Vector<Region> * surfaceDamageRegions)961     HWCLayerVersion1(struct hwc_composer_device_1* hwc, hwc_layer_1_t* layer,
962             Vector<Region>* visibleRegions,
963             Vector<Region>* surfaceDamageRegions)
964         : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer), mHwc(hwc),
965           mVisibleRegions(visibleRegions),
966           mSurfaceDamageRegions(surfaceDamageRegions) {}
967 
getCompositionType() const968     virtual int32_t getCompositionType() const {
969         return getLayer()->compositionType;
970     }
getHints() const971     virtual uint32_t getHints() const {
972         return getLayer()->hints;
973     }
getAndResetReleaseFence()974     virtual sp<Fence> getAndResetReleaseFence() {
975         int fd = getLayer()->releaseFenceFd;
976         getLayer()->releaseFenceFd = -1;
977         return fd >= 0 ? new Fence(fd) : Fence::NO_FENCE;
978     }
setAcquireFenceFd(int fenceFd)979     virtual void setAcquireFenceFd(int fenceFd) {
980         getLayer()->acquireFenceFd = fenceFd;
981     }
setPerFrameDefaultState()982     virtual void setPerFrameDefaultState() {
983         //getLayer()->compositionType = HWC_FRAMEBUFFER;
984     }
setPlaneAlpha(uint8_t alpha)985     virtual void setPlaneAlpha(uint8_t alpha) {
986         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_2)) {
987             getLayer()->planeAlpha = alpha;
988         } else {
989             if (alpha < 0xFF) {
990                 getLayer()->flags |= HWC_SKIP_LAYER;
991             }
992         }
993     }
setDefaultState()994     virtual void setDefaultState() {
995         hwc_layer_1_t* const l = getLayer();
996         l->compositionType = HWC_FRAMEBUFFER;
997         l->hints = 0;
998         l->flags = HWC_SKIP_LAYER;
999         l->handle = 0;
1000         l->transform = 0;
1001         l->blending = HWC_BLENDING_NONE;
1002         l->visibleRegionScreen.numRects = 0;
1003         l->visibleRegionScreen.rects = NULL;
1004         l->acquireFenceFd = -1;
1005         l->releaseFenceFd = -1;
1006         l->planeAlpha = 0xFF;
1007     }
setSkip(bool skip)1008     virtual void setSkip(bool skip) {
1009         if (skip) {
1010             getLayer()->flags |= HWC_SKIP_LAYER;
1011         } else {
1012             getLayer()->flags &= ~HWC_SKIP_LAYER;
1013         }
1014     }
setIsCursorLayerHint(bool isCursor)1015     virtual void setIsCursorLayerHint(bool isCursor) {
1016         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) {
1017             if (isCursor) {
1018                 getLayer()->flags |= HWC_IS_CURSOR_LAYER;
1019             }
1020             else {
1021                 getLayer()->flags &= ~HWC_IS_CURSOR_LAYER;
1022             }
1023         }
1024     }
setBlending(uint32_t blending)1025     virtual void setBlending(uint32_t blending) {
1026         getLayer()->blending = blending;
1027     }
setTransform(uint32_t transform)1028     virtual void setTransform(uint32_t transform) {
1029         getLayer()->transform = transform;
1030     }
setFrame(const Rect & frame)1031     virtual void setFrame(const Rect& frame) {
1032         getLayer()->displayFrame = reinterpret_cast<hwc_rect_t const&>(frame);
1033     }
setCrop(const FloatRect & crop)1034     virtual void setCrop(const FloatRect& crop) {
1035         if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) {
1036             getLayer()->sourceCropf = reinterpret_cast<hwc_frect_t const&>(crop);
1037         } else {
1038             /*
1039              * Since h/w composer didn't support a flot crop rect before version 1.3,
1040              * using integer coordinates instead produces a different output from the GL code in
1041              * Layer::drawWithOpenGL(). The difference can be large if the buffer crop to
1042              * window size ratio is large and a window crop is defined
1043              * (i.e.: if we scale the buffer a lot and we also crop it with a window crop).
1044              */
1045             hwc_rect_t& r = getLayer()->sourceCrop;
1046             r.left  = int(ceilf(crop.left));
1047             r.top   = int(ceilf(crop.top));
1048             r.right = int(floorf(crop.right));
1049             r.bottom= int(floorf(crop.bottom));
1050         }
1051     }
setVisibleRegionScreen(const Region & reg)1052     virtual void setVisibleRegionScreen(const Region& reg) {
1053         hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen;
1054         mVisibleRegions->editItemAt(mIndex) = reg;
1055         visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>(
1056                 mVisibleRegions->itemAt(mIndex).getArray(
1057                 &visibleRegion.numRects));
1058     }
setSurfaceDamage(const Region & reg)1059     virtual void setSurfaceDamage(const Region& reg) {
1060         if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_5)) {
1061             return;
1062         }
1063         hwc_region_t& surfaceDamage = getLayer()->surfaceDamage;
1064         // We encode default full-screen damage as INVALID_RECT upstream, but as
1065         // 0 rects for HWComposer
1066         if (reg.isRect() && reg.getBounds() == Rect::INVALID_RECT) {
1067             surfaceDamage.numRects = 0;
1068             surfaceDamage.rects = NULL;
1069             return;
1070         }
1071         mSurfaceDamageRegions->editItemAt(mIndex) = reg;
1072         surfaceDamage.rects = reinterpret_cast<hwc_rect_t const *>(
1073                 mSurfaceDamageRegions->itemAt(mIndex).getArray(
1074                 &surfaceDamage.numRects));
1075     }
setSidebandStream(const sp<NativeHandle> & stream)1076     virtual void setSidebandStream(const sp<NativeHandle>& stream) {
1077         ALOG_ASSERT(stream->handle() != NULL);
1078         getLayer()->compositionType = HWC_SIDEBAND;
1079         getLayer()->sidebandStream = stream->handle();
1080     }
setBuffer(const sp<GraphicBuffer> & buffer)1081     virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
1082         if (buffer == 0 || buffer->handle == 0) {
1083             getLayer()->compositionType = HWC_FRAMEBUFFER;
1084             getLayer()->flags |= HWC_SKIP_LAYER;
1085             getLayer()->handle = 0;
1086         } else {
1087             if (getLayer()->compositionType == HWC_SIDEBAND) {
1088                 // If this was a sideband layer but the stream was removed, reset
1089                 // it to FRAMEBUFFER. The HWC can change it to OVERLAY in prepare.
1090                 getLayer()->compositionType = HWC_FRAMEBUFFER;
1091             }
1092             getLayer()->handle = buffer->handle;
1093         }
1094     }
onDisplayed()1095     virtual void onDisplayed() {
1096         getLayer()->acquireFenceFd = -1;
1097     }
1098 
1099 protected:
1100     // Pointers to the vectors of Region backing-memory held in DisplayData.
1101     // Only the Region at mIndex corresponds to this Layer.
1102     Vector<Region>* mVisibleRegions;
1103     Vector<Region>* mSurfaceDamageRegions;
1104 };
1105 
1106 /*
1107  * returns an iterator initialized at a given index in the layer list
1108  */
getLayerIterator(int32_t id,size_t index)1109 HWComposer::LayerListIterator HWComposer::getLayerIterator(int32_t id, size_t index) {
1110     if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) {
1111         return LayerListIterator();
1112     }
1113     DisplayData& disp(mDisplayData[id]);
1114     if (!mHwc || !disp.list || index > disp.list->numHwLayers) {
1115         return LayerListIterator();
1116     }
1117     if (disp.visibleRegions.size() < disp.list->numHwLayers) {
1118         disp.visibleRegions.resize(disp.list->numHwLayers);
1119     }
1120     if (disp.surfaceDamageRegions.size() < disp.list->numHwLayers) {
1121         disp.surfaceDamageRegions.resize(disp.list->numHwLayers);
1122     }
1123     return LayerListIterator(new HWCLayerVersion1(mHwc, disp.list->hwLayers,
1124             &disp.visibleRegions, &disp.surfaceDamageRegions), index);
1125 }
1126 
1127 /*
1128  * returns an iterator on the beginning of the layer list
1129  */
begin(int32_t id)1130 HWComposer::LayerListIterator HWComposer::begin(int32_t id) {
1131     return getLayerIterator(id, 0);
1132 }
1133 
1134 /*
1135  * returns an iterator on the end of the layer list
1136  */
end(int32_t id)1137 HWComposer::LayerListIterator HWComposer::end(int32_t id) {
1138     size_t numLayers = 0;
1139     if (uint32_t(id) <= 31 && mAllocatedDisplayIDs.hasBit(id)) {
1140         const DisplayData& disp(mDisplayData[id]);
1141         if (mHwc && disp.list) {
1142             numLayers = disp.list->numHwLayers;
1143             if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
1144                 // with HWC 1.1, the last layer is always the HWC_FRAMEBUFFER_TARGET,
1145                 // which we ignore when iterating through the layer list.
1146                 ALOGE_IF(!numLayers, "mDisplayData[%d].list->numHwLayers is 0", id);
1147                 if (numLayers) {
1148                     numLayers--;
1149                 }
1150             }
1151         }
1152     }
1153     return getLayerIterator(id, numLayers);
1154 }
1155 
1156 // Converts a PixelFormat to a human-readable string.  Max 11 chars.
1157 // (Could use a table of prefab String8 objects.)
getFormatStr(PixelFormat format)1158 static String8 getFormatStr(PixelFormat format) {
1159     switch (format) {
1160     case PIXEL_FORMAT_RGBA_8888:    return String8("RGBA_8888");
1161     case PIXEL_FORMAT_RGBX_8888:    return String8("RGBx_8888");
1162     case PIXEL_FORMAT_RGBA_FP16:    return String8("RGBA_FP16");
1163     case PIXEL_FORMAT_RGBA_1010102: return String8("RGBA_1010102");
1164     case PIXEL_FORMAT_RGB_888:      return String8("RGB_888");
1165     case PIXEL_FORMAT_RGB_565:      return String8("RGB_565");
1166     case PIXEL_FORMAT_BGRA_8888:    return String8("BGRA_8888");
1167     case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
1168                                     return String8("ImplDef");
1169     default:
1170         String8 result;
1171         result.appendFormat("? %08x", format);
1172         return result;
1173     }
1174 }
1175 
dump(String8 & result) const1176 void HWComposer::dump(String8& result) const {
1177     Mutex::Autolock _l(mDisplayLock);
1178     if (mHwc) {
1179         result.appendFormat("Hardware Composer state (version %08x):\n", hwcApiVersion(mHwc));
1180         result.appendFormat("  mDebugForceFakeVSync=%d\n", mDebugForceFakeVSync);
1181         for (size_t i=0 ; i<mNumDisplays ; i++) {
1182             const DisplayData& disp(mDisplayData[i]);
1183             if (!disp.connected)
1184                 continue;
1185 
1186             const Vector< sp<Layer> >& visibleLayersSortedByZ =
1187                     mFlinger->getLayerSortedByZForHwcDisplay(i);
1188 
1189 
1190             result.appendFormat("  Display[%zd] configurations (* current):\n", i);
1191             for (size_t c = 0; c < disp.configs.size(); ++c) {
1192                 const DisplayConfig& config(disp.configs[c]);
1193                 result.appendFormat("    %s%zd: %ux%u, xdpi=%f, ydpi=%f"
1194                         ", refresh=%" PRId64 ", colorMode=%d\n",
1195                         c == disp.currentConfig ? "* " : "", c,
1196                         config.width, config.height, config.xdpi, config.ydpi,
1197                         config.refresh, config.colorMode);
1198             }
1199 
1200             if (disp.list) {
1201                 result.appendFormat(
1202                         "  numHwLayers=%zu, flags=%08x\n",
1203                         disp.list->numHwLayers, disp.list->flags);
1204 
1205                 result.append(
1206                         "    type   |  handle  | hint | flag | tr | blnd |   format    |     source crop (l,t,r,b)      |          frame         | name \n"
1207                         "-----------+----------+------+------+----+------+-------------+--------------------------------+------------------------+------\n");
1208                 //      " _________ | ________ | ____ | ____ | __ | ____ | ___________ |_____._,_____._,_____._,_____._ |_____,_____,_____,_____ | ___...
1209                 for (size_t i=0 ; i<disp.list->numHwLayers ; i++) {
1210                     const hwc_layer_1_t&l = disp.list->hwLayers[i];
1211                     int32_t format = -1;
1212                     String8 name("unknown");
1213 
1214                     if (i < visibleLayersSortedByZ.size()) {
1215                         const sp<Layer>& layer(visibleLayersSortedByZ[i]);
1216                         const sp<GraphicBuffer>& buffer(
1217                                 layer->getActiveBuffer());
1218                         if (buffer != NULL) {
1219                             format = buffer->getPixelFormat();
1220                         }
1221                         name = layer->getName();
1222                     }
1223 
1224                     int type = l.compositionType;
1225                     if (type == HWC_FRAMEBUFFER_TARGET) {
1226                         name = "HWC_FRAMEBUFFER_TARGET";
1227                         format = disp.format;
1228                     }
1229 
1230                     static char const* compositionTypeName[] = {
1231                             "GLES",
1232                             "HWC",
1233                             "BKGND",
1234                             "FB TARGET",
1235                             "SIDEBAND",
1236                             "HWC_CURSOR",
1237                             "UNKNOWN"};
1238                     if (type >= NELEM(compositionTypeName))
1239                         type = NELEM(compositionTypeName) - 1;
1240 
1241                     String8 formatStr = getFormatStr(format);
1242                     if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) {
1243                         result.appendFormat(
1244                                 " %9s | %08" PRIxPTR " | %04x | %04x | %02x | %04x | %-11s |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d | %s\n",
1245                                         compositionTypeName[type],
1246                                         intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, formatStr.string(),
1247                                         l.sourceCropf.left, l.sourceCropf.top, l.sourceCropf.right, l.sourceCropf.bottom,
1248                                         l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
1249                                         name.string());
1250                     } else {
1251                         result.appendFormat(
1252                                 " %9s | %08" PRIxPTR " | %04x | %04x | %02x | %04x | %-11s |%7d,%7d,%7d,%7d |%5d,%5d,%5d,%5d | %s\n",
1253                                         compositionTypeName[type],
1254                                         intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, formatStr.string(),
1255                                         l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom,
1256                                         l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
1257                                         name.string());
1258                     }
1259                 }
1260             }
1261         }
1262     }
1263 
1264     if (mHwc && mHwc->dump) {
1265         const size_t SIZE = 4096;
1266         char buffer[SIZE];
1267         mHwc->dump(mHwc, buffer, SIZE);
1268         result.append(buffer);
1269     }
1270 }
1271 
1272 // ---------------------------------------------------------------------------
1273 
VSyncThread(HWComposer & hwc)1274 HWComposer::VSyncThread::VSyncThread(HWComposer& hwc)
1275     : mHwc(hwc), mEnabled(false),
1276       mNextFakeVSync(0),
1277       mRefreshPeriod(hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY))
1278 {
1279 }
1280 
setEnabled(bool enabled)1281 void HWComposer::VSyncThread::setEnabled(bool enabled) {
1282     Mutex::Autolock _l(mLock);
1283     if (mEnabled != enabled) {
1284         mEnabled = enabled;
1285         mCondition.signal();
1286     }
1287 }
1288 
onFirstRef()1289 void HWComposer::VSyncThread::onFirstRef() {
1290     run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);
1291 }
1292 
threadLoop()1293 bool HWComposer::VSyncThread::threadLoop() {
1294     { // scope for lock
1295         Mutex::Autolock _l(mLock);
1296         while (!mEnabled) {
1297             mCondition.wait(mLock);
1298         }
1299     }
1300 
1301     const nsecs_t period = mRefreshPeriod;
1302     const nsecs_t now = systemTime(CLOCK_MONOTONIC);
1303     nsecs_t next_vsync = mNextFakeVSync;
1304     nsecs_t sleep = next_vsync - now;
1305     if (sleep < 0) {
1306         // we missed, find where the next vsync should be
1307         sleep = (period - ((now - next_vsync) % period));
1308         next_vsync = now + sleep;
1309     }
1310     mNextFakeVSync = next_vsync + period;
1311 
1312     struct timespec spec;
1313     spec.tv_sec  = next_vsync / 1000000000;
1314     spec.tv_nsec = next_vsync % 1000000000;
1315 
1316     int err;
1317     do {
1318         err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
1319     } while (err<0 && errno == EINTR);
1320 
1321     if (err == 0) {
1322         mHwc.mEventHandler.onVSyncReceived(&mHwc, 0, next_vsync);
1323     }
1324 
1325     return true;
1326 }
1327 
DisplayData()1328 HWComposer::DisplayData::DisplayData()
1329 :   configs(),
1330     currentConfig(0),
1331     format(HAL_PIXEL_FORMAT_RGBA_8888),
1332     connected(false),
1333     hasFbComp(false), hasOvComp(false),
1334     capacity(0), list(NULL),
1335     framebufferTarget(NULL), fbTargetHandle(0),
1336     lastRetireFence(Fence::NO_FENCE), lastDisplayFence(Fence::NO_FENCE),
1337     outbufHandle(NULL), outbufAcquireFence(Fence::NO_FENCE),
1338     events(0)
1339 {}
1340 
~DisplayData()1341 HWComposer::DisplayData::~DisplayData() {
1342     free(list);
1343 }
1344 
1345 // ---------------------------------------------------------------------------
1346 }; // namespace android
1347