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