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 2041d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden#include "DispSync.h" 212adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/GLConsumer.h> 22bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 23bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddennamespace android { 24bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 25bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 26bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden/* 272adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden * This is a thin wrapper around GLConsumer. 28bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden */ 292adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass SurfaceFlingerConsumer : public GLConsumer { 30bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddenpublic: 31399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall struct ContentsChangedListener: public FrameAvailableListener { 32399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual void onSidebandStreamChanged() = 0; 33399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall }; 34399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 35b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza SurfaceFlingerConsumer(const sp<IGraphicBufferConsumer>& consumer, 36b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza uint32_t tex) 37e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza : GLConsumer(consumer, tex, GLConsumer::TEXTURE_EXTERNAL, false, false), 3841d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden mTransformToDisplayInverse(false) 39bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden {} 40bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 41bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden class BufferRejecter { 42bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden friend class SurfaceFlingerConsumer; 43bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual bool reject(const sp<GraphicBuffer>& buf, 44db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian const IGraphicBufferConsumer::BufferItem& item) = 0; 45bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 46bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden protected: 47bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual ~BufferRejecter() { } 48bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden }; 49bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 50c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian virtual status_t acquireBufferLocked(BufferQueue::BufferItem *item, nsecs_t presentWhen); 51c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 52bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // This version of updateTexImage() takes a functor that may be used to 532adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // reject the newly acquired buffer. Unlike the GLConsumer version, 54bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // this does not guarantee that the buffer has been bound to the GL 55bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // texture. 5641d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden status_t updateTexImage(BufferRejecter* rejecter, const DispSync& dispSync); 57bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 582adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // See GLConsumer::bindTextureImageLocked(). 5997eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden status_t bindTextureImage(); 601585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 61c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // must be called from SF main thread 62c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool getTransformToDisplayInverse() const; 63c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 64399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // Sets the contents changed listener. This should be used instead of 65399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // ConsumerBase::setFrameAvailableListener(). 66399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall void setContentsChangedListener(const wp<ContentsChangedListener>& listener); 67399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 68399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> getSidebandStream() const; 69399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 701585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFaddenprivate: 7141d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden nsecs_t computeExpectedPresent(const DispSync& dispSync); 72c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 73399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual void onSidebandStreamChanged(); 74399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 75399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall wp<ContentsChangedListener> mContentsChangedListener; 76399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 77c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // Indicates this buffer must be transformed by the inverse transform of the screen 78c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // it is displayed onto. This is applied after GLConsumer::mCurrentTransform. 79c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // This must be set/read from SurfaceFlinger's main thread. 80c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool mTransformToDisplayInverse; 81bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; 82bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 83bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 84bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; // namespace android 85bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 86bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#endif // ANDROID_SURFACEFLINGERCONSUMER_H 87