13e87601170141229d661df93e2f59e1ced73474bMathias Agopian/* 23e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** 31a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ** Copyright 2012 The Android Open Source Project 43e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** 53e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** Licensed under the Apache License Version 2.0(the "License"); 63e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** you may not use this file except in compliance with the License. 73e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** You may obtain a copy of the License at 83e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** 93e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 103e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** 113e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** Unless required by applicable law or agreed to in writing software 123e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS 133e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 143e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** See the License for the specific language governing permissions and 153e87601170141229d661df93e2f59e1ced73474bMathias Agopian ** limitations under the License. 163e87601170141229d661df93e2f59e1ced73474bMathias Agopian */ 173e87601170141229d661df93e2f59e1ced73474bMathias Agopian 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza// #define LOG_NDEBUG 0 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#undef LOG_TAG 209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define LOG_TAG "FramebufferSurface" 219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 223e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <stdlib.h> 233e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <stdio.h> 243e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <string.h> 253e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <errno.h> 263e87601170141229d661df93e2f59e1ced73474bMathias Agopian 273e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <cutils/log.h> 283e87601170141229d661df93e2f59e1ced73474bMathias Agopian 293e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <utils/String8.h> 303e87601170141229d661df93e2f59e1ced73474bMathias Agopian 313e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <ui/Rect.h> 323e87601170141229d661df93e2f59e1ced73474bMathias Agopian 333e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <EGL/egl.h> 343e87601170141229d661df93e2f59e1ced73474bMathias Agopian 353e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <hardware/hardware.h> 3684493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/BufferItem.h> 37392edd88cb63d71a21a86a02cf9c56ac97637128Jamie Gennis#include <gui/GraphicBufferAlloc.h> 3884493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/Surface.h> 393e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <ui/GraphicBuffer.h> 403e87601170141229d661df93e2f59e1ced73474bMathias Agopian 4133ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "FramebufferSurface.h" 4233ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "HWComposer.h" 433e87601170141229d661df93e2f59e1ced73474bMathias Agopian 44cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#ifndef NUM_FRAMEBUFFER_SURFACE_BUFFERS 45cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#define NUM_FRAMEBUFFER_SURFACE_BUFFERS (2) 46cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#endif 47cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis 483e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 493e87601170141229d661df93e2f59e1ced73474bMathias Agopiannamespace android { 503e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 513e87601170141229d661df93e2f59e1ced73474bMathias Agopian 523e87601170141229d661df93e2f59e1ced73474bMathias Agopian/* 533e87601170141229d661df93e2f59e1ced73474bMathias Agopian * This implements the (main) framebuffer management. This class is used 543e87601170141229d661df93e2f59e1ced73474bMathias Agopian * mostly by SurfaceFlinger, but also by command line GL application. 553e87601170141229d661df93e2f59e1ced73474bMathias Agopian * 563e87601170141229d661df93e2f59e1ced73474bMathias Agopian */ 573e87601170141229d661df93e2f59e1ced73474bMathias Agopian 58db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianFramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp, 59db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferConsumer>& consumer) : 60db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian ConsumerBase(consumer), 61f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian mDisplayType(disp), 621a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot(-1), 639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentBuffer(), 649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence(Fence::NO_FENCE), 6540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#ifdef USE_HWC2 669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwc(hwc), 679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease(false), 689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer() 709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 71b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden mHwc(hwc) 729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 733e87601170141229d661df93e2f59e1ced73474bMathias Agopian{ 749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating for display %d", disp); 769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 78b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden mName = "FramebufferSurface"; 79db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(mName); 80db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB | 81f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_RENDER | 82f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_COMPOSER); 839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = mHwc.getActiveConfig(disp); 859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mConsumer->setDefaultBufferSize(activeConfig->getWidth(), 869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza activeConfig->getHeight()); 879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 88db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setDefaultBufferFormat(mHwc.getFormat(disp)); 899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mConsumer->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); 909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 9119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos mConsumer->setMaxAcquiredBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS - 1); 9299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 9399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 947cd85979e81cd632c37852f7ca716089dc52e899Jesse Hallstatus_t FramebufferSurface::beginFrame(bool /*mustRecompose*/) { 95028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return NO_ERROR; 96028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 97028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 9892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatus_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { 9938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 10038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 10138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 10299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t FramebufferSurface::advanceFrame() { 1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<GraphicBuffer> buf; 1059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> acquireFence(Fence::NO_FENCE); 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN; 1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = nextBuffer(buf, acquireFence, dataspace); 1089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (result != NO_ERROR) { 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("error latching next FramebufferSurface buffer: %s (%d)", 1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza strerror(-result), result); 1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return result; 1129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza result = mHwc.setClientTarget(mDisplayType, acquireFence, buf, dataspace); 1149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (result != NO_ERROR) { 1159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("error posting framebuffer: %d", result); 1169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return result; 1189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 11999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // Once we remove FB HAL support, we can call nextBuffer() from here 12099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // instead of using onFrameAvailable(). No real benefit, except it'll be 12199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall // more like VirtualDisplaySurface. 12299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall return NO_ERROR; 1239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 12499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 12599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 1269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastatus_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, 1289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence>& outFence, android_dataspace_t& outDataspace) { 1299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 130da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianstatus_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) { 1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock lock(mMutex); 1333e87601170141229d661df93e2f59e1ced73474bMathias Agopian 13484493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza BufferItem item; 1351585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden status_t err = acquireBufferLocked(&item, 0); 1361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 137da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outBuffer = mCurrentBuffer; 1381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } else if (err != NO_ERROR) { 1401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ALOGE("error acquiring buffer: %s (%d)", strerror(-err), err); 1411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 1421a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1433e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // If the BufferQueue has freed and reallocated a buffer in mCurrentSlot 1451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // then we may have acquired the slot we already own. If we had released 1461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // our current buffer before we call acquireBuffer then that release call 1471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // would have returned STALE_BUFFER_SLOT, and we would have called 1481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // freeBufferLocked on that slot. Because the buffer slot has already 1491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // been overwritten with the new buffer all we have to do is skip the 1501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // releaseBuffer call and we should be in the same state we'd be in if we 1511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // had released the old buffer first. 1521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT && 15347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos item.mSlot != mCurrentBufferSlot) { 1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = true; 1569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot = mCurrentBufferSlot; 1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer = mCurrentBuffer; 1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 1591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // Release the previous buffer. 160c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer, 161c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 162ad678e18b66f495efa78dc3b9ab99b579945c9e2Mathias Agopian if (err < NO_ERROR) { 1631a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ALOGE("error releasing buffer: %s (%d)", strerror(-err), err); 1641a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 1653e87601170141229d661df93e2f59e1ced73474bMathias Agopian } 1669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1671a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 16847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos mCurrentBufferSlot = item.mSlot; 1691a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBuffer = mSlots[mCurrentBufferSlot].mGraphicBuffer; 1709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence = item.mFence; 1719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 172da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outFence = item.mFence; 173da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outBuffer = mCurrentBuffer; 1749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza outDataspace = item.mDataSpace; 1769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1771a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1783e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 1793e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 181b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden// Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. 1828dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stozavoid FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { 1831a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis sp<GraphicBuffer> buf; 184da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian sp<Fence> acquireFence; 185da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian status_t err = nextBuffer(buf, acquireFence); 1861a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err != NO_ERROR) { 187da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)", 1881a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis strerror(-err), err); 1891a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return; 1901a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 191f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian err = mHwc.fbPost(mDisplayType, acquireFence, buf); 1921a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err != NO_ERROR) { 1931a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ALOGE("error posting framebuffer: %d", err); 1941a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1951a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1971a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1981a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid FramebufferSurface::freeBufferLocked(int slotIndex) { 1991a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ConsumerBase::freeBufferLocked(slotIndex); 2001a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (slotIndex == mCurrentBufferSlot) { 2011a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot = BufferQueue::INVALID_BUFFER_SLOT; 2021a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 2031a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 2041a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 205851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid FramebufferSurface::onFrameCommitted() { 2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHasPendingRelease) { 2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> fence = mHwc.getRetireFence(mDisplayType); 2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (fence->isValid()) { 2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = addReleaseFence(mPreviousBufferSlot, 2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, fence); 2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: failed to add the" 2139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " fence: %s (%d)", strerror(-result), result); 2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = releaseBufferLocked(mPreviousBufferSlot, 2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: error releasing buffer:" 2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " %s (%d)", strerror(-result), result); 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer.clear(); 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = false; 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 224851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall sp<Fence> fence = mHwc.getAndResetReleaseFence(mDisplayType); 22513f01cbdbd34779a234bc674df79e23672fd5c0bJesse Hall if (fence->isValid() && 22613f01cbdbd34779a234bc674df79e23672fd5c0bJesse Hall mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) { 227c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar status_t err = addReleaseFence(mCurrentBufferSlot, 228c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar mCurrentBuffer, fence); 22913f01cbdbd34779a234bc674df79e23672fd5c0bJesse Hall ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)", 23013f01cbdbd34779a234bc674df79e23672fd5c0bJesse Hall strerror(-err), err); 231da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian } 2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 233da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 234da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 2363e87601170141229d661df93e2f59e1ced73474bMathias Agopianstatus_t FramebufferSurface::compositionComplete() 2373e87601170141229d661df93e2f59e1ced73474bMathias Agopian{ 238b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden return mHwc.fbCompositionComplete(); 2393e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 2409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 2413e87601170141229d661df93e2f59e1ced73474bMathias Agopian 242f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stozavoid FramebufferSurface::dumpAsString(String8& result) const { 2431a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ConsumerBase::dump(result); 2443e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 2453e87601170141229d661df93e2f59e1ced73474bMathias Agopian 24674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid FramebufferSurface::dumpLocked(String8& result, const char* prefix) const 2477adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall{ 2489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef USE_HWC2 2497adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall mHwc.fbDump(result); 2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 25174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian ConsumerBase::dumpLocked(result, prefix); 2527adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall} 2537adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall 2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& FramebufferSurface::getClientTargetAcquireFence() const { 2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mCurrentFence; 2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2583e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 2593e87601170141229d661df93e2f59e1ced73474bMathias Agopian}; // namespace android 2603e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 261