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