FramebufferSurface.cpp revision 06d63de03cb2a551ca99608f5aa0c4f3e200b0fc
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 <ui/Rect.h> 313e87601170141229d661df93e2f59e1ced73474bMathias Agopian 323e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <EGL/egl.h> 333e87601170141229d661df93e2f59e1ced73474bMathias Agopian 343e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <hardware/hardware.h> 3584493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/BufferItem.h> 36392edd88cb63d71a21a86a02cf9c56ac97637128Jamie Gennis#include <gui/GraphicBufferAlloc.h> 3784493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza#include <gui/Surface.h> 383e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <ui/GraphicBuffer.h> 393e87601170141229d661df93e2f59e1ced73474bMathias Agopian 4033ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "FramebufferSurface.h" 4133ceeb32582739dd74e404593d9ddf8adf5100bbMathias Agopian#include "HWComposer.h" 423e87601170141229d661df93e2f59e1ced73474bMathias Agopian 43cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#ifndef NUM_FRAMEBUFFER_SURFACE_BUFFERS 44cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#define NUM_FRAMEBUFFER_SURFACE_BUFFERS (2) 45cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis#endif 46cdbaecb54152ce98789823420d426077d72aa1e7Jamie Gennis 473e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 483e87601170141229d661df93e2f59e1ced73474bMathias Agopiannamespace android { 493e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 503e87601170141229d661df93e2f59e1ced73474bMathias Agopian 513e87601170141229d661df93e2f59e1ced73474bMathias Agopian/* 523e87601170141229d661df93e2f59e1ced73474bMathias Agopian * This implements the (main) framebuffer management. This class is used 533e87601170141229d661df93e2f59e1ced73474bMathias Agopian * mostly by SurfaceFlinger, but also by command line GL application. 543e87601170141229d661df93e2f59e1ced73474bMathias Agopian * 553e87601170141229d661df93e2f59e1ced73474bMathias Agopian */ 563e87601170141229d661df93e2f59e1ced73474bMathias Agopian 57db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianFramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp, 58db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const sp<IGraphicBufferConsumer>& consumer) : 59db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian ConsumerBase(consumer), 60f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian mDisplayType(disp), 611a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot(-1), 629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentBuffer(), 639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence(Fence::NO_FENCE), 649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwc(hwc), 669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease(false), 679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), 689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer() 699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc(hwc) 719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 723e87601170141229d661df93e2f59e1ced73474bMathias Agopian{ 739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating for display %d", disp); 759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 77b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden mName = "FramebufferSurface"; 78db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(mName); 79db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB | 80f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_RENDER | 81f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian GRALLOC_USAGE_HW_COMPOSER); 829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = mHwc.getActiveConfig(disp); 849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mConsumer->setDefaultBufferSize(activeConfig->getWidth(), 859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza activeConfig->getHeight()); 869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mConsumer->setDefaultBufferFormat(mHwc.getFormat(disp)); 889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mConsumer->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); 899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 9019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos mConsumer->setMaxAcquiredBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS - 1); 9199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 9299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 937cd85979e81cd632c37852f7ca716089dc52e899Jesse Hallstatus_t FramebufferSurface::beginFrame(bool /*mustRecompose*/) { 94028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall return NO_ERROR; 95028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall} 96028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall 9792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatus_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { 9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall return NO_ERROR; 9938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall} 10038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall 10199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallstatus_t FramebufferSurface::advanceFrame() { 1029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 10306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu uint32_t slot = 0; 1049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<GraphicBuffer> buf; 1059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> acquireFence(Fence::NO_FENCE); 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN; 10706d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu status_t result = nextBuffer(slot, 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 } 11306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu result = mHwc.setClientTarget(mDisplayType, slot, 11406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu acquireFence, buf, dataspace); 1159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (result != NO_ERROR) { 1169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("error posting framebuffer: %d", result); 1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return result; 1199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Once we remove FB HAL support, we can call nextBuffer() from here 1219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // instead of using onFrameAvailable(). No real benefit, except it'll be 1229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // more like VirtualDisplaySurface. 1239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 1249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 12599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} 12699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall 1279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 12806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wustatus_t FramebufferSurface::nextBuffer(uint32_t& outSlot, 12906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence, 13006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu android_dataspace_t& outDataspace) { 1319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) { 1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock lock(mMutex); 1353e87601170141229d661df93e2f59e1ced73474bMathias Agopian 13684493cd420d3d53a16ae7c745ed38afffb4e67f5Dan Stoza BufferItem item; 1371585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden status_t err = acquireBufferLocked(&item, 0); 1381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 13906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#ifdef USE_HWC2 14006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mHwcBufferCache->getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, 14106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &outSlot, &outBuffer); 14206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#else 143da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outBuffer = mCurrentBuffer; 14406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#endif 1451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } else if (err != NO_ERROR) { 1471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ALOGE("error acquiring buffer: %s (%d)", strerror(-err), err); 1481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 1491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1503e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // If the BufferQueue has freed and reallocated a buffer in mCurrentSlot 1521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // then we may have acquired the slot we already own. If we had released 1531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // our current buffer before we call acquireBuffer then that release call 1541a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // would have returned STALE_BUFFER_SLOT, and we would have called 1551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // freeBufferLocked on that slot. Because the buffer slot has already 1561a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // been overwritten with the new buffer all we have to do is skip the 1571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // releaseBuffer call and we should be in the same state we'd be in if we 1581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // had released the old buffer first. 1591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT && 16047650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos item.mSlot != mCurrentBufferSlot) { 1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = true; 1639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBufferSlot = mCurrentBufferSlot; 1649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer = mCurrentBuffer; 1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Release the previous buffer. 1679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer, 1689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 1699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err < NO_ERROR) { 1709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error releasing buffer: %s (%d)", strerror(-err), err); 1719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return err; 1729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 17547650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos mCurrentBufferSlot = item.mSlot; 1761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBuffer = mSlots[mCurrentBufferSlot].mGraphicBuffer; 1779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentFence = item.mFence; 1789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 179da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian outFence = item.mFence; 1809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 18106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mHwcBufferCache->getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, 18206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu &outSlot, &outBuffer); 1839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza outDataspace = item.mDataSpace; 18406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#else 18506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu outBuffer = mCurrentBuffer; 1869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1871a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return NO_ERROR; 1883e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 1893e87601170141229d661df93e2f59e1ced73474bMathias Agopian 1909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 1919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. 1929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { 1939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<GraphicBuffer> buf; 1949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> acquireFence; 1959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = nextBuffer(buf, acquireFence); 1969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 1979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)", 1989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard strerror(-err), err); 1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 2009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc.fbPost(mDisplayType, acquireFence, buf); 2029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 2039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("error posting framebuffer: %d", err); 2049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2081a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid FramebufferSurface::freeBufferLocked(int slotIndex) { 2091a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis ConsumerBase::freeBufferLocked(slotIndex); 2101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (slotIndex == mCurrentBufferSlot) { 2111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mCurrentBufferSlot = BufferQueue::INVALID_BUFFER_SLOT; 2121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 2131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 2141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 215851cfe834295224cd64bdd499872b95b19c4de8cJesse Hallvoid FramebufferSurface::onFrameCommitted() { 2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHasPendingRelease) { 21811d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard sp<Fence> fence = mHwc.getPresentFence(mDisplayType); 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (fence->isValid()) { 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = addReleaseFence(mPreviousBufferSlot, 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, fence); 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: failed to add the" 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " fence: %s (%d)", strerror(-result), result); 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t result = releaseBufferLocked(mPreviousBufferSlot, 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(result != NO_ERROR, "onFrameCommitted: error releasing buffer:" 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " %s (%d)", strerror(-result), result); 2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mPreviousBuffer.clear(); 2319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHasPendingRelease = false; 2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sp<Fence> fence = mHwc.getAndResetReleaseFence(mDisplayType); 2359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (fence->isValid() && 2369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) { 2379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = addReleaseFence(mCurrentBufferSlot, 2389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentBuffer, fence); 2399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)", 2409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard strerror(-err), err); 2419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 243da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 244da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t FramebufferSurface::compositionComplete() 2479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 2489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mHwc.fbCompositionComplete(); 2499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 252f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stozavoid FramebufferSurface::dumpAsString(String8& result) const { 2533d1d280fa3cbc30700f728a4b13e5308315433d3Colin Cross ConsumerBase::dumpState(result); 2543e87601170141229d661df93e2f59e1ced73474bMathias Agopian} 2553e87601170141229d661df93e2f59e1ced73474bMathias Agopian 25674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid FramebufferSurface::dumpLocked(String8& result, const char* prefix) const 2577adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall{ 2589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifndef USE_HWC2 2599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc.fbDump(result); 2609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 26174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian ConsumerBase::dumpLocked(result, prefix); 2627adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall} 2637adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall 2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaconst sp<Fence>& FramebufferSurface::getClientTargetAcquireFence() const { 2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mCurrentFence; 2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2683e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 2693e87601170141229d661df93e2f59e1ced73474bMathias Agopian}; // namespace android 2703e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------- 271