SurfaceFlingerConsumer.cpp revision 1df8c345854155cbbcb9f80de9d12d66ea70ac08
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"
21bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
22bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#include <utils/Trace.h>
23bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#include <utils/Errors.h>
24bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
25bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
26bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddennamespace android {
27bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
28bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------
29bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
30bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddenstatus_t SurfaceFlingerConsumer::updateTexImage(BufferRejecter* rejecter)
31bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden{
32bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    ATRACE_CALL();
33bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    ALOGV("updateTexImage");
34bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    Mutex::Autolock lock(mMutex);
35bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
36bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (mAbandoned) {
372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        ALOGE("updateTexImage: GLConsumer is abandoned!");
38bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return NO_INIT;
39bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
40bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
41bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Make sure the EGL state is the same as in previous calls.
42bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    status_t err = checkAndUpdateEglStateLocked();
43bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
44bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
45bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
46bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
47bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    BufferQueue::BufferItem item;
48bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
49bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Acquire the next buffer.
50bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // In asynchronous mode the list is guaranteed to be one buffer
51bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // deep, while in synchronous mode we use the oldest buffer.
52bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    err = acquireBufferLocked(&item);
53bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
54bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        if (err == BufferQueue::NO_BUFFER_AVAILABLE) {
55bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            // This variant of updateTexImage does not guarantee that the
56bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            // texture is bound, so no need to call glBindTexture.
57bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            err = NO_ERROR;
58bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        } else {
59bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden            ALOGE("updateTexImage: acquire failed: %s (%d)",
60bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden                strerror(-err), err);
61bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        }
62bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
63bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
64bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
65bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
66bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // We call the rejecter here, in case the caller has a reason to
67bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // not accept this buffer.  This is used by SurfaceFlinger to
68bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // reject buffers which have the wrong size
69bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    int buf = item.mBuf;
70bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (rejecter && rejecter->reject(mSlots[buf].mGraphicBuffer, item)) {
71bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        releaseBufferLocked(buf, EGL_NO_SYNC_KHR);
72bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return NO_ERROR;
73bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
74bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
75bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Release the previous buffer.
76bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    err = releaseAndUpdateLocked(item);
77bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    if (err != NO_ERROR) {
78bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden        return err;
79bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    }
80bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
8197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    if (!sUseNativeFenceSync) {
8297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // Bind the new buffer to the GL texture.
8397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        //
8497eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // Older devices require the "implicit" synchronization provided
8597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // by glEGLImageTargetTexture2DOES, which this method calls.  Newer
8697eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // devices will either call this in Layer::onDraw, or (if it's not
8797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        // a GL-composited layer) not at all.
8897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden        err = bindTextureImageLocked();
8997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    }
9097eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
9197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    return err;
9297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden}
9397eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
9497eba8904c2f221c42a9473407223a4c3a213f75Andy McFaddenstatus_t SurfaceFlingerConsumer::bindTextureImage()
9597eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden{
9697eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    Mutex::Autolock lock(mMutex);
9797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden
9897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden    return bindTextureImageLocked();
99bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}
100bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
101bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------
102bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; // namespace android
103bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden
104