1bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden/*
2bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * Copyright (C) 2012 The Android Open Source Project
3bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden *
4bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * you may not use this file except in compliance with the License.
6bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * You may obtain a copy of the License at
7bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden *
8bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden *
10bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * Unless required by applicable law or agreed to in writing, software
11bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * See the License for the specific language governing permissions and
14bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden * limitations under the License.
15bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden */
16bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
17bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#define ATRACE_TAG ATRACE_TAG_GRAPHICS
181df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis//#define LOG_NDEBUG 0
19bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
20bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#include "SurfaceFlingerConsumer.h"
21ce796e78a57018f186b062199c75d94545318acaPablo Ceballos#include "Layer.h"
22bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
23ca08833d5ea99130797e10ad68a651b50e99da74Mathias Agopian#include <private/gui/SyncFeatures.h>
24ca08833d5ea99130797e10ad68a651b50e99da74Mathias Agopian
2511611f9be590480d7ea27bf0153558573ddcded2Dan Stoza#include <gui/BufferItem.h>
26a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h>
2711611f9be590480d7ea27bf0153558573ddcded2Dan Stoza
28bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#include <utils/Errors.h>
29399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h>
30399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/Trace.h>
31bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
32bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddennamespace android {
33bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
34bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------
35bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
3641d67d7ab4da1c393497a620a116a854b3c618e7Andy McFaddenstatus_t SurfaceFlingerConsumer::updateTexImage(BufferRejecter* rejecter,
37ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        const DispSync& dispSync, bool* autoRefresh, bool* queuedBuffer,
38063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos        uint64_t maxFrameNumber)
39bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden{
40bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    ATRACE_CALL();
41bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    ALOGV("updateTexImage");
42bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    Mutex::Autolock lock(mMutex);
43bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
44bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mAbandoned) {
452adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        ALOGE("updateTexImage: GLConsumer is abandoned!");
46bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return NO_INIT;
47bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
48bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
49bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Make sure the EGL state is the same as in previous calls.
50bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = checkAndUpdateEglStateLocked();
51bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
52bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
53bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
54bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
5511611f9be590480d7ea27bf0153558573ddcded2Dan Stoza    BufferItem item;
56bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
57bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Acquire the next buffer.
58bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // In asynchronous mode the list is guaranteed to be one buffer
59bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // deep, while in synchronous mode we use the oldest buffer.
60a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza    err = acquireBufferLocked(&item, computeExpectedPresent(dispSync),
61a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            maxFrameNumber);
62bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
63bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        if (err == BufferQueue::NO_BUFFER_AVAILABLE) {
64bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            err = NO_ERROR;
651585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden        } else if (err == BufferQueue::PRESENT_LATER) {
661585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden            // return the error, without logging
67bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        } else {
68bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            ALOGE("updateTexImage: acquire failed: %s (%d)",
69bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden                strerror(-err), err);
70bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        }
71bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
72bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
73bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
740a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard    if (autoRefresh) {
750a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard        *autoRefresh = item.mAutoRefresh;
760a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard    }
770a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard
780a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard    if (queuedBuffer) {
790a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard        *queuedBuffer = item.mQueuedBuffer;
800a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard    }
810a4b26ecb6a9f772502c770fbe4c9fc661578cb7Fabien Sanglard
82bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // We call the rejecter here, in case the caller has a reason to
83bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // not accept this buffer.  This is used by SurfaceFlinger to
84bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // reject buffers which have the wrong size
8547650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    int slot = item.mSlot;
8647650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    if (rejecter && rejecter->reject(mSlots[slot].mGraphicBuffer, item)) {
8747650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos        releaseBufferLocked(slot, mSlots[slot].mGraphicBuffer, EGL_NO_SYNC_KHR);
88ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza        return BUFFER_REJECTED;
89bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
90bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
91bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Release the previous buffer.
929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    err = updateAndReleaseLocked(item, &mPendingRelease);
949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
95ad678e18b66f495efa78dc3b9ab99b579945c9e2Mathias Agopian    err = updateAndReleaseLocked(item);
969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
97bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
98bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
99bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
100bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
101ca08833d5ea99130797e10ad68a651b50e99da74Mathias Agopian    if (!SyncFeatures::getInstance().useNativeFenceSync()) {
10297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // Bind the new buffer to the GL texture.
10397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        //
10497eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // Older devices require the "implicit" synchronization provided
10597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // by glEGLImageTargetTexture2DOES, which this method calls.  Newer
10697eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // devices will either call this in Layer::onDraw, or (if it's not
10797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // a GL-composited layer) not at all.
10897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        err = bindTextureImageLocked();
10997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    }
11097eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
11197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    return err;
11297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden}
11397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
11497eba8904c2f221c42a9473407223a4c3a213f75Andy McFaddenstatus_t SurfaceFlingerConsumer::bindTextureImage()
11597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden{
11697eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    Mutex::Autolock lock(mMutex);
11797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
11897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    return bindTextureImageLocked();
119bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}
120bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
12111611f9be590480d7ea27bf0153558573ddcded2Dan Stozastatus_t SurfaceFlingerConsumer::acquireBufferLocked(BufferItem* item,
122a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza        nsecs_t presentWhen, uint64_t maxFrameNumber) {
123a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza    status_t result = GLConsumer::acquireBufferLocked(item, presentWhen,
124a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            maxFrameNumber);
125c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    if (result == NO_ERROR) {
126c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian        mTransformToDisplayInverse = item->mTransformToDisplayInverse;
127ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza        mSurfaceDamage = item->mSurfaceDamage;
128c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    }
129c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return result;
130c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
131c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
132c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopianbool SurfaceFlingerConsumer::getTransformToDisplayInverse() const {
133367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    Mutex::Autolock lock(mMutex);
134c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian    return mTransformToDisplayInverse;
135c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian}
136c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian
137ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozaconst Region& SurfaceFlingerConsumer::getSurfaceDamage() const {
138ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza    return mSurfaceDamage;
139ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza}
140ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza
141399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallsp<NativeHandle> SurfaceFlingerConsumer::getSidebandStream() const {
1420c9a1ed91f8e19887ac43eff5af16e59878c8226Dan Stoza    sp<NativeHandle> stream;
1430c9a1ed91f8e19887ac43eff5af16e59878c8226Dan Stoza    mConsumer->getSidebandStream(&stream);
1440c9a1ed91f8e19887ac43eff5af16e59878c8226Dan Stoza    return stream;
145399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
146399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
1471585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// We need to determine the time when a buffer acquired now will be
1481585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// displayed.  This can be calculated:
1491585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden//   time when previous buffer's actual-present fence was signaled
1501585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden//    + current display refresh rate * HWC latency
1511585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden//    + a little extra padding
1521585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden//
1531585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// Buffer producers are expected to set their desired presentation time
1541585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// based on choreographer time stamps, which (coming from vsync events)
1551585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// will be slightly later then the actual-present timing.  If we get a
1561585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// desired-present time that is unintentionally a hair after the next
1571585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden// vsync, we'll hold the frame when we really want to display it.  We
15841d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// need to take the offset between actual-present and reported-vsync
15941d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// into account.
16041d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden//
16141d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// If the system is configured without a DispSync phase offset for the app,
16241d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// we also want to throw in a bit of padding to avoid edge cases where we
16341d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// just barely miss.  We want to do it here, not in every app.  A major
16441d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// source of trouble is the app's use of the display's ideal refresh time
16541d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// (via Display.getRefreshRate()), which could be off of the actual refresh
16641d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// by a few percent, with the error multiplied by the number of frames
16741d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// between now and when the buffer should be displayed.
16841d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden//
16941d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// If the refresh reported to the app has a phase offset, we shouldn't need
17041d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden// to tweak anything here.
17141d67d7ab4da1c393497a620a116a854b3c618e7Andy McFaddennsecs_t SurfaceFlingerConsumer::computeExpectedPresent(const DispSync& dispSync)
1721585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden{
1731585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden    // The HWC doesn't currently have a way to report additional latency.
17441d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // Assume that whatever we submit now will appear right after the flip.
17541d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // For a smart panel this might be 1.  This is expressed in frames,
17641d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // rather than time, because we expect to have a constant frame delay
17741d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // regardless of the refresh rate.
17841d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    const uint32_t hwcLatency = 0;
17941d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden
18041d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // Ask DispSync when the next refresh will be (CLOCK_MONOTONIC).
18141d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    const nsecs_t nextRefresh = dispSync.computeNextRefresh(hwcLatency);
18241d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden
18341d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // The DispSync time is already adjusted for the difference between
184c45a7d9dfdefa07512c5acc07bcbee5362b34e3dFabien Sanglard    // vsync and reported-vsync (SurfaceFlinger::dispSyncPresentTimeOffset), so
18541d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // we don't need to factor that in here.  Pad a little to avoid
18641d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    // weird effects if apps might be requesting times right on the edge.
18741d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    nsecs_t extraPadding = 0;
1880cc1938871edd6659d6783404a3523abc6b98d92Fabien Sanglard    if (SurfaceFlinger::vsyncPhaseOffsetNs == 0) {
18941d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden        extraPadding = 1000000;        // 1ms (6% of 60Hz)
19041d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    }
1911585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
19241d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden    return nextRefresh + extraPadding;
1931585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden}
1941585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden
1953546a3f08ad84099db4006d651c656d58d2ed566Brian Andersonsp<Fence> SurfaceFlingerConsumer::getPrevFinalReleaseFence() const {
1963546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson    Mutex::Autolock lock(mMutex);
1973546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson    return ConsumerBase::mPrevFinalReleaseFence;
1983546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson}
1993546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson
2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid SurfaceFlingerConsumer::setReleaseFence(const sp<Fence>& fence)
2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza{
2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (!mPendingRelease.isPending) {
2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        GLConsumer::setReleaseFence(fence);
2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        return;
2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    auto currentTexture = mPendingRelease.currentTexture;
2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (fence->isValid() &&
2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            currentTexture != BufferQueue::INVALID_BUFFER_SLOT) {
2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        status_t result = addReleaseFence(currentTexture,
2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                mPendingRelease.graphicBuffer, fence);
2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGE_IF(result != NO_ERROR, "setReleaseFence: failed to add the"
2139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza                " fence: %s (%d)", strerror(-result), result);
2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
2175ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonbool SurfaceFlingerConsumer::releasePendingBuffer()
2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza{
2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (!mPendingRelease.isPending) {
2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        ALOGV("Pending buffer already released");
2215ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        return false;
2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    }
2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    ALOGV("Releasing pending buffer");
2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    Mutex::Autolock lock(mMutex);
2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    status_t result = releaseBufferLocked(mPendingRelease.currentTexture,
2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            mPendingRelease.graphicBuffer, mPendingRelease.display,
2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            mPendingRelease.fence);
2283a156e11abc86f0fb7f3f503ca534140ea2a9a56Fabien Sanglard    ALOGE_IF(result < NO_ERROR, "releasePendingBuffer failed: %s (%d)",
2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza            strerror(-result), result);
2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mPendingRelease = PendingRelease();
2315ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    return true;
2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}
2339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
2349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
235399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid SurfaceFlingerConsumer::setContentsChangedListener(
236399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        const wp<ContentsChangedListener>& listener) {
237399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    setFrameAvailableListener(listener);
238399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    Mutex::Autolock lock(mMutex);
239399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    mContentsChangedListener = listener;
240399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
241399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
242399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid SurfaceFlingerConsumer::onSidebandStreamChanged() {
24395971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza    FrameAvailableListener* unsafeFrameAvailableListener = nullptr;
24495971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza    {
24595971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza        Mutex::Autolock lock(mFrameAvailableMutex);
24695971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza        unsafeFrameAvailableListener = mFrameAvailableListener.unsafe_get();
24795971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza    }
248399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    sp<ContentsChangedListener> listener;
249399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    {   // scope for the lock
250399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        Mutex::Autolock lock(mMutex);
25195971c8172495f7b6a0ede1a3508472b9a4e7b36Dan Stoza        ALOG_ASSERT(unsafeFrameAvailableListener == mContentsChangedListener.unsafe_get());
252399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        listener = mContentsChangedListener.promote();
253399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
254399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
255399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    if (listener != NULL) {
256399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        listener->onSidebandStreamChanged();
257399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
258399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall}
259399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
2605ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid SurfaceFlingerConsumer::onDisconnect() {
2615ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    sp<Layer> l = mLayer.promote();
2625ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    if (l.get()) {
2635ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson        l->onDisconnect();
2645ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson    }
2655ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson}
2665ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson
2673890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid SurfaceFlingerConsumer::addAndGetFrameTimestamps(
268d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson        const NewFrameEventsEntry* newTimestamps,
2693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        FrameEventHistoryDelta *outDelta) {
270d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    sp<Layer> l = mLayer.promote();
2713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    if (l.get()) {
2723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        l->addAndGetFrameTimestamps(newTimestamps, outDelta);
273d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson    }
274ce796e78a57018f186b062199c75d94545318acaPablo Ceballos}
275ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
276bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------
277bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; // namespace android
278bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
279