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 22a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <errno.h> 233e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <stdio.h> 24a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <stdlib.h> 253e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <string.h> 263e87601170141229d661df93e2f59e1ced73474bMathias Agopian 273e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <utils/String8.h> 287823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h> 293e87601170141229d661df93e2f59e1ced73474bMathias Agopian 303e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <EGL/egl.h> 313e87601170141229d661df93e2f59e1ced73474bMathias Agopian 323e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <hardware/hardware.h> 3384493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/BufferItem.h> 34a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <gui/BufferQueue.h> 3584493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/Surface.h> 36a9347647eca3101c014be902b713772de3977d87Mathias Agopian 373e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <ui/GraphicBuffer.h> 38a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <ui/Rect.h> 393e87601170141229d661df93e2f59e1ced73474bMathias Agopian 4033ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "FramebufferSurface.h" 4133ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "HWComposer.h" 421971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard#include "../SurfaceFlinger.h" 43cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis 443e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 453e87601170141229d661df93e2f59e1ced73474bMathias Agopiannamespace android { 463e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 473e87601170141229d661df93e2f59e1ced73474bMathias Agopian 483e87601170141229d661df93e2f59e1ced73474bMathias Agopian/* 493e87601170141229d661df93e2f59e1ced73474bMathias Agopian * This implements the (main) framebuffer management. This class is used 503e87601170141229d661df93e2f59e1ced73474bMathias Agopian * mostly by SurfaceFlinger, but also by command line GL application. 513e87601170141229d661df93e2f59e1ced73474bMathias Agopian * 523e87601170141229d661df93e2f59e1ced73474bMathias Agopian */ 533e87601170141229d661df93e2f59e1ced73474bMathias Agopian 54db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianFramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp, 55db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferConsumer>& consumer) : 56db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian ConsumerBase(consumer), 57f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian mDisplayType(disp), 581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot(-1), 599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentBuffer(), 609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence(Fence::NO_FENCE), 619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwc(hwc), 639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease(false), 649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer() 669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc(hwc) 689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 693e87601170141229d661df93e2f59e1ced73474bMathias Agopian{ 709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating for display %d", disp); 729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 74b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden mName = "FramebufferSurface"; 75db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(mName); 76db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB | 77f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_RENDER | 78f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_COMPOSER); 799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = mHwc.getActiveConfig(disp); 819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mConsumer->setDefaultBufferSize(activeConfig->getWidth(), 829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza activeConfig->getHeight()); 839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mConsumer->setDefaultBufferFormat(mHwc.getFormat(disp)); 859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mConsumer->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); 869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 871971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard mConsumer->setMaxAcquiredBufferCount( 881971b63aa4d82db37794f19e0eb01feb1826e422Fabien Sanglard SurfaceFlinger::maxFrameBufferAcquiredBuffers - 1); 8999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 9099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 917cd85979e81cd632c37852f7ca716089dc52e899Jesse Hallstatus_t FramebufferSurface::beginFrame(bool /*mustRecompose*/) { 92028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return NO_ERROR; 93028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 94028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 9592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatus_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { 9638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 9738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 9999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t FramebufferSurface::advanceFrame() { 1009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 10106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t slot = 0; 1029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<GraphicBuffer> buf; 1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> acquireFence(Fence::NO_FENCE); 1049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN; 10506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu status_t result = nextBuffer(slot, buf, acquireFence, dataspace); 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (result != NO_ERROR) { 1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("error latching next FramebufferSurface buffer: %s (%d)", 1089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza strerror(-result), result); 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return result; 1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 11106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu result = mHwc.setClientTarget(mDisplayType, slot, 11206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu acquireFence, buf, dataspace); 1139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (result != NO_ERROR) { 1149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("error posting framebuffer: %d", result); 1159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return result; 1179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Once we remove FB HAL support, we can call nextBuffer() from here 1199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // instead of using onFrameAvailable(). No real benefit, except it'll be 1209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // more like VirtualDisplaySurface. 1219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 1229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 12499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 1259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 12606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wustatus_t FramebufferSurface::nextBuffer(uint32_t& outSlot, 12706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence, 12806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu android_dataspace_t& outDataspace) { 1299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) { 1319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#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) { 13706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#ifdef USE_HWC2 138aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu mHwcBufferCache.getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, 13906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &outSlot, &outBuffer); 14006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#else 141da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outBuffer = mCurrentBuffer; 14206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#endif 1431a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } else if (err != NO_ERROR) { 1451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ALOGE("error acquiring buffer: %s (%d)", strerror(-err), err); 1461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 1471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1483e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // If the BufferQueue has freed and reallocated a buffer in mCurrentSlot 1501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // then we may have acquired the slot we already own. If we had released 1511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // our current buffer before we call acquireBuffer then that release call 1521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // would have returned STALE_BUFFER_SLOT, and we would have called 1531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // freeBufferLocked on that slot. Because the buffer slot has already 1541a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // been overwritten with the new buffer all we have to do is skip the 1551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // releaseBuffer call and we should be in the same state we'd be in if we 1561a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // had released the old buffer first. 1571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT && 15847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos item.mSlot != mCurrentBufferSlot) { 1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = true; 1619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot = mCurrentBufferSlot; 1629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer = mCurrentBuffer; 1639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Release the previous buffer. 1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer, 1669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 1679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err < NO_ERROR) { 1689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error releasing buffer: %s (%d)", strerror(-err), err); 1699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return err; 1709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 17347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos mCurrentBufferSlot = item.mSlot; 1741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBuffer = mSlots[mCurrentBufferSlot].mGraphicBuffer; 1759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence = item.mFence; 1769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 177da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outFence = item.mFence; 1789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 179aaff73f92a2fcadda8c765eb9b02f2849418a873Chia-I Wu mHwcBufferCache.getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, 18006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &outSlot, &outBuffer); 1819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza outDataspace = item.mDataSpace; 18206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#else 18306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu outBuffer = mCurrentBuffer; 1849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1851a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1863e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 1873e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 1899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. 1909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { 1919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<GraphicBuffer> buf; 1929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> acquireFence; 1939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = nextBuffer(buf, acquireFence); 1949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 1959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)", 1969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard strerror(-err), err); 1979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 1989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc.fbPost(mDisplayType, acquireFence, buf); 2009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 2019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error posting framebuffer: %d", err); 2029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2061a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid FramebufferSurface::freeBufferLocked(int slotIndex) { 2071a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ConsumerBase::freeBufferLocked(slotIndex); 2081a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (slotIndex == mCurrentBufferSlot) { 2091a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot = BufferQueue::INVALID_BUFFER_SLOT; 2101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 2111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 2121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 213851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid FramebufferSurface::onFrameCommitted() { 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHasPendingRelease) { 21611d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard sp<Fence> fence = mHwc.getPresentFence(mDisplayType); 2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (fence->isValid()) { 2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = addReleaseFence(mPreviousBufferSlot, 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, fence); 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: failed to add the" 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " fence: %s (%d)", strerror(-result), result); 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = releaseBufferLocked(mPreviousBufferSlot, 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: error releasing buffer:" 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " %s (%d)", strerror(-result), result); 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer.clear(); 2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = false; 2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mHwc.getAndResetReleaseFence(mDisplayType); 2339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid() && 2349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) { 2359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = addReleaseFence(mCurrentBufferSlot, 2369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentBuffer, fence); 2379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)", 2389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard strerror(-err), err); 2399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 241da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 242da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t FramebufferSurface::compositionComplete() 2459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 2469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mHwc.fbCompositionComplete(); 2479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 250f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stozavoid FramebufferSurface::dumpAsString(String8& result) const { 2513d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross ConsumerBase::dumpState(result); 2523e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 2533e87601170141229d661df93e2f59e1ced73474bMathias Agopian 25474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid FramebufferSurface::dumpLocked(String8& result, const char* prefix) const 2557adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall{ 2569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc.fbDump(result); 2589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 25974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian ConsumerBase::dumpLocked(result, prefix); 2607adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall} 2617adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall 2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& FramebufferSurface::getClientTargetAcquireFence() const { 2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mCurrentFence; 2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2663e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 2673e87601170141229d661df93e2f59e1ced73474bMathias Agopian}; // namespace android 2683e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 269