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