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