HWComposer.cpp revision 5880cc573823148237eac9ab7bc586b8e4eb7160
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// Uncomment this to remove support for HWC_DEVICE_API_VERSION_0_3 and older
20// #define HWC_REMOVE_DEPRECATED_VERSIONS 1
21
22#include <stdint.h>
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <sys/types.h>
27
28#include <utils/Errors.h>
29#include <utils/String8.h>
30#include <utils/Thread.h>
31#include <utils/Trace.h>
32#include <utils/Vector.h>
33
34#include <hardware/hardware.h>
35#include <hardware/hwcomposer.h>
36
37#include <cutils/log.h>
38#include <cutils/properties.h>
39
40#include <EGL/egl.h>
41
42#include "LayerBase.h"
43#include "HWComposer.h"
44#include "SurfaceFlinger.h"
45
46namespace android {
47
48// ---------------------------------------------------------------------------
49// Support for HWC_DEVICE_API_VERSION_0_3 and older:
50// Since v0.3 is deprecated and support will be dropped soon, as much as
51// possible the code is written to target v1.0. When using a v0.3 HWC, we
52// allocate v0.3 structures, but assign them to v1.0 pointers. Fields that
53// exist in both versions are located at the same offset, so in most cases we
54// can just use the v1.0 pointer without branches or casts.
55
56#if HWC_REMOVE_DEPRECATED_VERSIONS
57// We need complete types with to satisfy semantic checks, even though the
58// code paths that use these won't get executed at runtime (and will likely be
59// dead-code-eliminated). When we remove the code to support v0.3 we can remove
60// these as well.
61typedef hwc_layer_1_t hwc_layer_t;
62typedef hwc_layer_list_1_t hwc_layer_list_t;
63typedef hwc_composer_device_1_t hwc_composer_device_t;
64#endif
65
66// This function assumes we've already rejected HWC's with lower-than-required
67// versions. Don't use it for the initial "does HWC meet requirements" check!
68static bool hwcHasVersion(const hwc_composer_device_1_t* hwc, uint32_t version) {
69    if (HWC_REMOVE_DEPRECATED_VERSIONS &&
70            version <= HWC_DEVICE_API_VERSION_1_0) {
71        return true;
72    } else {
73        return hwc->common.version >= version;
74    }
75}
76
77static size_t sizeofHwcLayerList(const hwc_composer_device_1_t* hwc,
78        size_t numLayers) {
79    if (hwcHasVersion(hwc, HWC_DEVICE_API_VERSION_1_0)) {
80        return sizeof(hwc_layer_list_1_t) + numLayers*sizeof(hwc_layer_1_t);
81    } else {
82        return sizeof(hwc_layer_list_t) + numLayers*sizeof(hwc_layer_t);
83    }
84}
85
86// ---------------------------------------------------------------------------
87
88struct HWComposer::cb_context {
89    struct callbacks : public hwc_procs_t {
90        // these are here to facilitate the transition when adding
91        // new callbacks (an implementation can check for NULL before
92        // calling a new callback).
93        void (*zero[4])(void);
94    };
95    callbacks procs;
96    HWComposer* hwc;
97};
98
99// ---------------------------------------------------------------------------
100
101HWComposer::HWComposer(
102        const sp<SurfaceFlinger>& flinger,
103        EventHandler& handler,
104        nsecs_t refreshPeriod)
105    : mFlinger(flinger),
106      mModule(0), mHwc(0), mList(0), mCapacity(0),
107      mNumOVLayers(0), mNumFBLayers(0),
108      mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE),
109      mCBContext(new cb_context),
110      mEventHandler(handler),
111      mRefreshPeriod(refreshPeriod),
112      mVSyncCount(0), mDebugForceFakeVSync(false)
113{
114    char value[PROPERTY_VALUE_MAX];
115    property_get("debug.sf.no_hw_vsync", value, "0");
116    mDebugForceFakeVSync = atoi(value);
117
118    bool needVSyncThread = false;
119    int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
120    ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
121    if (err == 0) {
122        err = hwc_open_1(mModule, &mHwc);
123        ALOGE_IF(err, "%s device failed to initialize (%s)",
124                HWC_HARDWARE_COMPOSER, strerror(-err));
125        if (err == 0) {
126            if (HWC_REMOVE_DEPRECATED_VERSIONS &&
127                    mHwc->common.version < HWC_DEVICE_API_VERSION_1_0) {
128                ALOGE("%s device version %#x too old, will not be used",
129                        HWC_HARDWARE_COMPOSER, mHwc->common.version);
130                hwc_close_1(mHwc);
131                mHwc = NULL;
132            }
133        }
134
135        if (mHwc) {
136            if (mHwc->registerProcs) {
137                mCBContext->hwc = this;
138                mCBContext->procs.invalidate = &hook_invalidate;
139                mCBContext->procs.vsync = &hook_vsync;
140                mHwc->registerProcs(mHwc, &mCBContext->procs);
141                memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero));
142            }
143            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) {
144                if (mDebugForceFakeVSync) {
145                    // make sure to turn h/w vsync off in "fake vsync" mode
146                    mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
147                }
148            } else {
149                needVSyncThread = true;
150            }
151        }
152    } else {
153        needVSyncThread = true;
154    }
155
156    if (needVSyncThread) {
157        // we don't have VSYNC support, we need to fake it
158        mVSyncThread = new VSyncThread(*this);
159    }
160}
161
162HWComposer::~HWComposer() {
163    eventControl(EVENT_VSYNC, 0);
164    free(mList);
165    if (mVSyncThread != NULL) {
166        mVSyncThread->requestExitAndWait();
167    }
168    if (mHwc) {
169        hwc_close_1(mHwc);
170    }
171    delete mCBContext;
172}
173
174status_t HWComposer::initCheck() const {
175    return mHwc ? NO_ERROR : NO_INIT;
176}
177
178void HWComposer::hook_invalidate(struct hwc_procs* procs) {
179    reinterpret_cast<cb_context *>(procs)->hwc->invalidate();
180}
181
182void HWComposer::hook_vsync(struct hwc_procs* procs, int dpy, int64_t timestamp) {
183    reinterpret_cast<cb_context *>(procs)->hwc->vsync(dpy, timestamp);
184}
185
186void HWComposer::invalidate() {
187    mFlinger->repaintEverything();
188}
189
190void HWComposer::vsync(int dpy, int64_t timestamp) {
191    ATRACE_INT("VSYNC", ++mVSyncCount&1);
192    mEventHandler.onVSyncReceived(dpy, timestamp);
193}
194
195void HWComposer::eventControl(int event, int enabled) {
196    status_t err = NO_ERROR;
197    if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
198        if (!mDebugForceFakeVSync) {
199            err = mHwc->methods->eventControl(mHwc, event, enabled);
200            // error here should not happen -- not sure what we should
201            // do if it does.
202            ALOGE_IF(err, "eventControl(%d, %d) failed %s",
203                    event, enabled, strerror(-err));
204        }
205    }
206
207    if (err == NO_ERROR && mVSyncThread != NULL) {
208        mVSyncThread->setEnabled(enabled);
209    }
210}
211
212void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) {
213    mDpy = (hwc_display_t)dpy;
214    mSur = (hwc_surface_t)sur;
215}
216
217status_t HWComposer::createWorkList(size_t numLayers) {
218    if (mHwc) {
219        if (!mList || mCapacity < numLayers) {
220            free(mList);
221            size_t size = sizeofHwcLayerList(mHwc, numLayers);
222            mList = (hwc_layer_list_1_t*)malloc(size);
223            mCapacity = numLayers;
224        }
225        mList->flags = HWC_GEOMETRY_CHANGED;
226        mList->numHwLayers = numLayers;
227    }
228    return NO_ERROR;
229}
230
231status_t HWComposer::prepare() const {
232    int err = mHwc->prepare(mHwc, mList);
233    if (err == NO_ERROR) {
234        size_t numOVLayers = 0;
235        size_t numFBLayers = 0;
236        size_t count = mList->numHwLayers;
237        for (size_t i=0 ; i<count ; i++) {
238            hwc_layer_1_t* l = NULL;
239            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
240                l = &mList->hwLayers[i];
241            } else {
242                // mList really has hwc_layer_list_t memory layout
243                hwc_layer_list_t* list = (hwc_layer_list_t*)mList;
244                hwc_layer_t* layer = &list->hwLayers[i];
245                l = (hwc_layer_1_t*)layer;
246            }
247            if (l->flags & HWC_SKIP_LAYER) {
248                l->compositionType = HWC_FRAMEBUFFER;
249            }
250            switch (l->compositionType) {
251                case HWC_OVERLAY:
252                    numOVLayers++;
253                    break;
254                case HWC_FRAMEBUFFER:
255                    numFBLayers++;
256                    break;
257            }
258        }
259        mNumOVLayers = numOVLayers;
260        mNumFBLayers = numFBLayers;
261    }
262    return (status_t)err;
263}
264
265size_t HWComposer::getLayerCount(int type) const {
266    switch (type) {
267        case HWC_OVERLAY:
268            return mNumOVLayers;
269        case HWC_FRAMEBUFFER:
270            return mNumFBLayers;
271    }
272    return 0;
273}
274
275status_t HWComposer::commit() const {
276    int err = mHwc->set(mHwc, mDpy, mSur, mList);
277    if (mList) {
278        mList->flags &= ~HWC_GEOMETRY_CHANGED;
279    }
280    return (status_t)err;
281}
282
283status_t HWComposer::release() const {
284    if (mHwc) {
285        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) {
286            mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
287        }
288        int err = mHwc->set(mHwc, NULL, NULL, NULL);
289        return (status_t)err;
290    }
291    return NO_ERROR;
292}
293
294status_t HWComposer::disable() {
295    if (mHwc) {
296        free(mList);
297        mList = NULL;
298        int err = mHwc->prepare(mHwc, NULL);
299        return (status_t)err;
300    }
301    return NO_ERROR;
302}
303
304size_t HWComposer::getNumLayers() const {
305    return mList ? mList->numHwLayers : 0;
306}
307
308/*
309 * Helper template to implement a concrete HWCLayer
310 * This holds the pointer to the concrete hwc layer type
311 * and implements the "iterable" side of HWCLayer.
312 */
313template<typename CONCRETE, typename HWCTYPE>
314class Iterable : public HWComposer::HWCLayer {
315protected:
316    HWCTYPE* const mLayerList;
317    HWCTYPE* mCurrentLayer;
318    Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer) { }
319    inline HWCTYPE const * getLayer() const { return mCurrentLayer; }
320    inline HWCTYPE* getLayer() { return mCurrentLayer; }
321    virtual ~Iterable() { }
322private:
323    // returns a copy of ourselves
324    virtual HWComposer::HWCLayer* dup() {
325        return new CONCRETE( static_cast<const CONCRETE&>(*this) );
326    }
327    virtual status_t setLayer(size_t index) {
328        mCurrentLayer = &mLayerList[index];
329        return NO_ERROR;
330    }
331};
332
333// #if !HWC_REMOVE_DEPRECATED_VERSIONS
334/*
335 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_0_3
336 * This implements the HWCLayer side of HWCIterableLayer.
337 */
338class HWCLayerVersion0 : public Iterable<HWCLayerVersion0, hwc_layer_t> {
339public:
340    HWCLayerVersion0(hwc_layer_t* layer)
341        : Iterable<HWCLayerVersion0, hwc_layer_t>(layer) { }
342
343    virtual int32_t getCompositionType() const {
344        return getLayer()->compositionType;
345    }
346    virtual uint32_t getHints() const {
347        return getLayer()->hints;
348    }
349
350    virtual void setDefaultState() {
351        getLayer()->compositionType = HWC_FRAMEBUFFER;
352        getLayer()->hints = 0;
353        getLayer()->flags = HWC_SKIP_LAYER;
354        getLayer()->transform = 0;
355        getLayer()->blending = HWC_BLENDING_NONE;
356        getLayer()->visibleRegionScreen.numRects = 0;
357        getLayer()->visibleRegionScreen.rects = NULL;
358    }
359    virtual void setSkip(bool skip) {
360        if (skip) {
361            getLayer()->flags |= HWC_SKIP_LAYER;
362        } else {
363            getLayer()->flags &= ~HWC_SKIP_LAYER;
364        }
365    }
366    virtual void setBlending(uint32_t blending) {
367        getLayer()->blending = blending;
368    }
369    virtual void setTransform(uint32_t transform) {
370        getLayer()->transform = transform;
371    }
372    virtual void setFrame(const Rect& frame) {
373        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
374    }
375    virtual void setCrop(const Rect& crop) {
376        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
377    }
378    virtual void setVisibleRegionScreen(const Region& reg) {
379        getLayer()->visibleRegionScreen.rects =
380                reinterpret_cast<hwc_rect_t const *>(
381                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
382    }
383    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
384        if (buffer == 0 || buffer->handle == 0) {
385            getLayer()->compositionType = HWC_FRAMEBUFFER;
386            getLayer()->flags |= HWC_SKIP_LAYER;
387            getLayer()->handle = 0;
388        } else {
389            getLayer()->handle = buffer->handle;
390        }
391    }
392};
393// #endif // !HWC_REMOVE_DEPRECATED_VERSIONS
394
395/*
396 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0.
397 * This implements the HWCLayer side of HWCIterableLayer.
398 */
399class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> {
400public:
401    HWCLayerVersion1(hwc_layer_1_t* layer)
402        : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer) { }
403
404    virtual int32_t getCompositionType() const {
405        return getLayer()->compositionType;
406    }
407    virtual uint32_t getHints() const {
408        return getLayer()->hints;
409    }
410
411    virtual void setDefaultState() {
412        getLayer()->compositionType = HWC_FRAMEBUFFER;
413        getLayer()->hints = 0;
414        getLayer()->flags = HWC_SKIP_LAYER;
415        getLayer()->transform = 0;
416        getLayer()->blending = HWC_BLENDING_NONE;
417        getLayer()->visibleRegionScreen.numRects = 0;
418        getLayer()->visibleRegionScreen.rects = NULL;
419        getLayer()->acquireFenceFd = -1;
420        getLayer()->releaseFenceFd = -1;
421    }
422    virtual void setSkip(bool skip) {
423        if (skip) {
424            getLayer()->flags |= HWC_SKIP_LAYER;
425        } else {
426            getLayer()->flags &= ~HWC_SKIP_LAYER;
427        }
428    }
429    virtual void setBlending(uint32_t blending) {
430        getLayer()->blending = blending;
431    }
432    virtual void setTransform(uint32_t transform) {
433        getLayer()->transform = transform;
434    }
435    virtual void setFrame(const Rect& frame) {
436        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
437    }
438    virtual void setCrop(const Rect& crop) {
439        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
440    }
441    virtual void setVisibleRegionScreen(const Region& reg) {
442        getLayer()->visibleRegionScreen.rects =
443                reinterpret_cast<hwc_rect_t const *>(
444                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
445    }
446    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
447        if (buffer == 0 || buffer->handle == 0) {
448            getLayer()->compositionType = HWC_FRAMEBUFFER;
449            getLayer()->flags |= HWC_SKIP_LAYER;
450            getLayer()->handle = 0;
451        } else {
452            getLayer()->handle = buffer->handle;
453        }
454    }
455};
456
457/*
458 * returns an iterator initialized at a given index in the layer list
459 */
460HWComposer::LayerListIterator HWComposer::getLayerIterator(size_t index) {
461    if (!mList || index > mList->numHwLayers) {
462        return LayerListIterator();
463    }
464    if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
465        return LayerListIterator(new HWCLayerVersion1(mList->hwLayers), index);
466    } else {
467        hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
468        return LayerListIterator(new HWCLayerVersion0(list0->hwLayers), index);
469    }
470}
471
472/*
473 * returns an iterator on the beginning of the layer list
474 */
475HWComposer::LayerListIterator HWComposer::begin() {
476    return getLayerIterator(0);
477}
478
479/*
480 * returns an iterator on the end of the layer list
481 */
482HWComposer::LayerListIterator HWComposer::end() {
483    return getLayerIterator(getNumLayers());
484}
485
486
487
488void HWComposer::dump(String8& result, char* buffer, size_t SIZE,
489        const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const {
490    if (mHwc && mList) {
491        result.append("Hardware Composer state:\n");
492        result.appendFormat("  mDebugForceFakeVSync=%d\n",
493                mDebugForceFakeVSync);
494        result.appendFormat("  numHwLayers=%u, flags=%08x\n",
495                mList->numHwLayers, mList->flags);
496        result.append(
497                "   type   |  handle  |   hints  |   flags  | tr | blend |  format  |       source crop         |           frame           name \n"
498                "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n");
499        //      " ________ | ________ | ________ | ________ | __ | _____ | ________ | [_____,_____,_____,_____] | [_____,_____,_____,_____]
500        for (size_t i=0 ; i<mList->numHwLayers ; i++) {
501            hwc_layer_1_t l;
502            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
503                l = mList->hwLayers[i];
504            } else {
505                hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
506                *(hwc_layer_t*)&l = list0->hwLayers[i];
507                l.acquireFenceFd = l.releaseFenceFd = -1;
508            }
509            const sp<LayerBase> layer(visibleLayersSortedByZ[i]);
510            int32_t format = -1;
511            if (layer->getLayer() != NULL) {
512                const sp<GraphicBuffer>& buffer(layer->getLayer()->getActiveBuffer());
513                if (buffer != NULL) {
514                    format = buffer->getPixelFormat();
515                }
516            }
517            result.appendFormat(
518                    " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n",
519                    l.compositionType ? "OVERLAY" : "FB",
520                    intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format,
521                    l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom,
522                    l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
523                    layer->getName().string());
524        }
525    }
526    if (mHwc && hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_1) && mHwc->dump) {
527        mHwc->dump(mHwc, buffer, SIZE);
528        result.append(buffer);
529    }
530}
531
532// ---------------------------------------------------------------------------
533
534HWComposer::VSyncThread::VSyncThread(HWComposer& hwc)
535    : mHwc(hwc), mEnabled(false),
536      mNextFakeVSync(0),
537      mRefreshPeriod(hwc.mRefreshPeriod)
538{
539}
540
541void HWComposer::VSyncThread::setEnabled(bool enabled) {
542    Mutex::Autolock _l(mLock);
543    mEnabled = enabled;
544    mCondition.signal();
545}
546
547void HWComposer::VSyncThread::onFirstRef() {
548    run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);
549}
550
551bool HWComposer::VSyncThread::threadLoop() {
552    { // scope for lock
553        Mutex::Autolock _l(mLock);
554        while (!mEnabled) {
555            mCondition.wait(mLock);
556        }
557    }
558
559    const nsecs_t period = mRefreshPeriod;
560    const nsecs_t now = systemTime(CLOCK_MONOTONIC);
561    nsecs_t next_vsync = mNextFakeVSync;
562    nsecs_t sleep = next_vsync - now;
563    if (sleep < 0) {
564        // we missed, find where the next vsync should be
565        sleep = (period - ((now - next_vsync) % period));
566        next_vsync = now + sleep;
567    }
568    mNextFakeVSync = next_vsync + period;
569
570    struct timespec spec;
571    spec.tv_sec  = next_vsync / 1000000000;
572    spec.tv_nsec = next_vsync % 1000000000;
573
574    int err;
575    do {
576        err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
577    } while (err<0 && errno == EINTR);
578
579    if (err == 0) {
580        mHwc.mEventHandler.onVSyncReceived(0, next_vsync);
581    }
582
583    return true;
584}
585
586// ---------------------------------------------------------------------------
587}; // namespace android
588