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#ifndef ANDROID_SURFACEFLINGERCONSUMER_H 18bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#define ANDROID_SURFACEFLINGERCONSUMER_H 19bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 202adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/GLConsumer.h> 21bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 22bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddennamespace android { 23bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 24bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 25bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden/* 262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden * This is a thin wrapper around GLConsumer. 27bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden */ 282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass SurfaceFlingerConsumer : public GLConsumer { 29bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddenpublic: 303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian SurfaceFlingerConsumer(const sp<BufferQueue>& bq, uint32_t tex) 313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian : GLConsumer(bq, tex, GLConsumer::TEXTURE_EXTERNAL, false) 32bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden {} 33bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 34bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden class BufferRejecter { 35bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden friend class SurfaceFlingerConsumer; 36bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual bool reject(const sp<GraphicBuffer>& buf, 37db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const IGraphicBufferConsumer::BufferItem& item) = 0; 38bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 39bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden protected: 40bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual ~BufferRejecter() { } 41bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden }; 42bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 43c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian virtual status_t acquireBufferLocked(BufferQueue::BufferItem *item, nsecs_t presentWhen); 44c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 45bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // This version of updateTexImage() takes a functor that may be used to 462adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // reject the newly acquired buffer. Unlike the GLConsumer version, 47bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // this does not guarantee that the buffer has been bound to the GL 48bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // texture. 49bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t updateTexImage(BufferRejecter* rejecter); 50bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 512adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // See GLConsumer::bindTextureImageLocked(). 5297eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden status_t bindTextureImage(); 531585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 54c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // must be called from SF main thread 55c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool getTransformToDisplayInverse() const; 56c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 571585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFaddenprivate: 581585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden nsecs_t computeExpectedPresent(); 59c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 60c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // Indicates this buffer must be transformed by the inverse transform of the screen 61c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // it is displayed onto. This is applied after GLConsumer::mCurrentTransform. 62c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // This must be set/read from SurfaceFlinger's main thread. 63c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool mTransformToDisplayInverse; 64bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; 65bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 66bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 67bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; // namespace android 68bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 69bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#endif // ANDROID_SURFACEFLINGERCONSUMER_H 70