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