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" 21a9347647eca3101c014be902b713772de3977d87Mathias Agopian 22a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <ui/Region.h> 232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/GLConsumer.h> 24bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 25bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddennamespace android { 26bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 27bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 28ce796e78a57018f186b062199c75d94545318acaPablo Ceballosclass Layer; 29ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 30bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden/* 312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden * This is a thin wrapper around GLConsumer. 32bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden */ 332adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass SurfaceFlingerConsumer : public GLConsumer { 34bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFaddenpublic: 35ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza static const status_t BUFFER_REJECTED = UNKNOWN_ERROR + 8; 36ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 37399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall struct ContentsChangedListener: public FrameAvailableListener { 38399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual void onSidebandStreamChanged() = 0; 39399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall }; 40399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 41b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza SurfaceFlingerConsumer(const sp<IGraphicBufferConsumer>& consumer, 42d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson uint32_t tex, Layer* layer) 43e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza : GLConsumer(consumer, tex, GLConsumer::TEXTURE_EXTERNAL, false, false), 443546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson mTransformToDisplayInverse(false), mSurfaceDamage(), mLayer(layer) 45bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden {} 46bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 47bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden class BufferRejecter { 48bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden friend class SurfaceFlingerConsumer; 49bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual bool reject(const sp<GraphicBuffer>& buf, 5011611f9be590480d7ea27bf0153558573ddcded2Dan Stoza const BufferItem& item) = 0; 51bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 52bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden protected: 53bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden virtual ~BufferRejecter() { } 54bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden }; 55bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 56a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza virtual status_t acquireBufferLocked(BufferItem *item, nsecs_t presentWhen, 57a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza uint64_t maxFrameNumber = 0) override; 58c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 59bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // This version of updateTexImage() takes a functor that may be used to 602adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // reject the newly acquired buffer. Unlike the GLConsumer version, 61bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // this does not guarantee that the buffer has been bound to the GL 62bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // texture. 63a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t updateTexImage(BufferRejecter* rejecter, const DispSync& dispSync, 64ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool* autoRefresh, bool* queuedBuffer, 653546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson uint64_t maxFrameNumber); 66bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 672adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden // See GLConsumer::bindTextureImageLocked(). 6897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden status_t bindTextureImage(); 691585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 70c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool getTransformToDisplayInverse() const; 71367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 72367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr // must be called from SF main thread 73ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza const Region& getSurfaceDamage() const; 74c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 75399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // Sets the contents changed listener. This should be used instead of 76399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // ConsumerBase::setFrameAvailableListener(). 77399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall void setContentsChangedListener(const wp<ContentsChangedListener>& listener); 78399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 79399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> getSidebandStream() const; 80399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 8141d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden nsecs_t computeExpectedPresent(const DispSync& dispSync); 82c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 833546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson sp<Fence> getPrevFinalReleaseFence() const; 849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 853546a3f08ad84099db4006d651c656d58d2ed566Brian Anderson virtual void setReleaseFence(const sp<Fence>& fence) override; 865ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson bool releasePendingBuffer(); 879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 895ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson void onDisconnect() override; 905ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson void addAndGetFrameTimestamps( 91d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson const NewFrameEventsEntry* newTimestamps, 923890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta* outDelta) override; 93ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 946b9454d1fee0347711af1746642aa7820b1ea04dDan Stozaprivate: 95399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual void onSidebandStreamChanged(); 96399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 97399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall wp<ContentsChangedListener> mContentsChangedListener; 98399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 99c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // Indicates this buffer must be transformed by the inverse transform of the screen 100c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // it is displayed onto. This is applied after GLConsumer::mCurrentTransform. 101c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // This must be set/read from SurfaceFlinger's main thread. 102c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian bool mTransformToDisplayInverse; 103ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 104ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza // The portion of this surface that has changed since the previous frame 105ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza Region mSurfaceDamage; 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // A release that is pending on the receipt of a new release fence from 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // presentDisplay 1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza PendingRelease mPendingRelease; 1119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 11240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 113ce796e78a57018f186b062199c75d94545318acaPablo Ceballos // The layer for this SurfaceFlingerConsumer 114d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson const wp<Layer> mLayer; 115bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; 116bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 117bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden// ---------------------------------------------------------------------------- 118bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden}; // namespace android 119bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden 120bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#endif // ANDROID_SURFACEFLINGERCONSUMER_H 121