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