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