11a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis/*
21a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Copyright (C) 2010 The Android Open Source Project
31a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
41a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
51a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * you may not use this file except in compliance with the License.
61a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * You may obtain a copy of the License at
71a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
81a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
91a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Unless required by applicable law or agreed to in writing, software
111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * See the License for the specific language governing permissions and
141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * limitations under the License.
151a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis */
161a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
171a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#ifndef ANDROID_GUI_CONSUMERBASE_H
181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define ANDROID_GUI_CONSUMERBASE_H
191a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/BufferQueue.h>
211a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <ui/GraphicBuffer.h>
231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/String8.h>
251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/Vector.h>
261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/threads.h>
27a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IConsumerListener.h>
281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
291a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisnamespace android {
301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ----------------------------------------------------------------------------
311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisclass String8;
331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ConsumerBase is a base class for BufferQueue consumer end-points. It
351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// handles common tasks like management of the connection to the BufferQueue
361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// and the buffer pool.
371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisclass ConsumerBase : public virtual RefBase,
38a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian        protected ConsumerListener {
391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennispublic:
401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    struct FrameAvailableListener : public virtual RefBase {
41dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza        // See IConsumerListener::onFrame{Available,Replaced}
428dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza        virtual void onFrameAvailable(const BufferItem& item) = 0;
43dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza        virtual void onFrameReplaced(const BufferItem& /* item */) {}
441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    };
451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual ~ConsumerBase();
471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandon frees all the buffers and puts the ConsumerBase into the
491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // 'abandoned' state.  Once put in this state the ConsumerBase can never
501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // leave it.  When in the 'abandoned' state, all methods of the
512adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    // IGraphicBufferProducer interface will fail with the NO_INIT error.
521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // Note that while calling this method causes all the buffers to be freed
541a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // from the perspective of the the ConsumerBase, if there are additional
551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // references on the buffers (e.g. if a buffer is referenced by a client
561a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // or by OpenGL ES as a texture) then those buffer will remain allocated.
571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void abandon();
581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
59e478305181bb8dc8706361bc702256fe73f958deJohn Reck    // Returns true if the ConsumerBase is in the 'abandoned' state
60e478305181bb8dc8706361bc702256fe73f958deJohn Reck    bool isAbandoned();
61e478305181bb8dc8706361bc702256fe73f958deJohn Reck
621a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // set the name of the ConsumerBase that will be used to identify it in
631a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // log messages.
641a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void setName(const String8& name);
651a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
667adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // dump writes the current state to a string. Child classes should add
677adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // their state to the dump by overriding the dumpLocked method, which is
687adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // called by these methods after locking the mutex.
691a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void dump(String8& result) const;
7074d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    void dump(String8& result, const char* prefix) const;
711a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // setFrameAvailableListener sets the listener object that will be notified
731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // when a new frame becomes available.
74a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin    void setFrameAvailableListener(const wp<FrameAvailableListener>& listener);
751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
76634f5ee6a713b3cf4086a2af8e9b56e76cba245fDan Stoza    // See IGraphicBufferConsumer::detachBuffer
77634f5ee6a713b3cf4086a2af8e9b56e76cba245fDan Stoza    status_t detachBuffer(int slot);
78634f5ee6a713b3cf4086a2af8e9b56e76cba245fDan Stoza
79847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    // See IGraphicBufferConsumer::setDefaultBufferSize
80847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    status_t setDefaultBufferSize(uint32_t width, uint32_t height);
81847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine
82847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    // See IGraphicBufferConsumer::setDefaultBufferFormat
83847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    status_t setDefaultBufferFormat(PixelFormat defaultFormat);
84847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine
85847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    // See IGraphicBufferConsumer::setDefaultBufferDataSpace
86847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine    status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace);
87847f11e215e86b107ab50c1359fc7bc3cd7a3a11Michael Lentine
881a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisprivate:
891a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    ConsumerBase(const ConsumerBase&);
901a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void operator=(const ConsumerBase&);
911a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
921a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisprotected:
939fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // ConsumerBase constructs a new ConsumerBase object to consume image
94db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    // buffers from the given IGraphicBufferConsumer.
95595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    // The controlledByApp flag indicates that this consumer is under the application's
96595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    // control.
97db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    ConsumerBase(const sp<IGraphicBufferConsumer>& consumer, bool controlledByApp = false);
981a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
99ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // onLastStrongRef gets called by RefBase just before the dtor of the most
100ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // derived class.  It is used to clean up the buffers so that ConsumerBase
101ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // can coordinate the clean-up by calling into virtual methods implemented
102ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // by the derived classes.  This would not be possible from the
103ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // ConsuemrBase dtor because by the time that gets called the derived
104ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // classes have already been destructed.
105ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    //
106ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // This methods should not need to be overridden by derived classes, but
107ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // if they are overridden the ConsumerBase implementation must be called
108ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // from the derived class.
109ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    virtual void onLastStrongRef(const void* id);
110ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis
111e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // Implementation of the IConsumerListener interface.  These
112e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // calls are used to notify the ConsumerBase of asynchronous events in the
113e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // BufferQueue.  The onFrameAvailable, onFrameReplaced, and
114e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // onBuffersReleased methods should not need to be overridden by derived
115e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // classes, but if they are overridden the ConsumerBase implementation must
116e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // be called from the derived class. The ConsumerBase version of
117e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // onSidebandStreamChanged does nothing and can be overriden by derived
118e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    // classes if they want the notification.
119e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    virtual void onFrameAvailable(const BufferItem& item) override;
120e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    virtual void onFrameReplaced(const BufferItem& item) override;
121e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    virtual void onBuffersReleased() override;
122e07e3e5ef56b768d73e78fb273f2cfe6ebffc945Pablo Ceballos    virtual void onSidebandStreamChanged() override;
1231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // freeBufferLocked frees up the given buffer slot.  If the slot has been
1251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // initialized this will release the reference to the GraphicBuffer in that
1269fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // slot.  Otherwise it has no effect.
1279fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1289fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to clean up any state they
1299fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // keep per slot.  If it is overridden, the derived class's implementation
1309fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // must call ConsumerBase::freeBufferLocked.
1311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
1321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // This method must be called with mMutex locked.
1331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void freeBufferLocked(int slotIndex);
1341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandonLocked puts the BufferQueue into the abandoned state, causing
1361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // all future operations on it to fail. This method rather than the public
1371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandon method should be overridden by child classes to add abandon-
1381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // time behavior.
1391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
1409fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to clean up any object
1419fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // state they keep (as opposed to per-slot state).  If it is overridden,
1429fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // the derived class's implementation must call ConsumerBase::abandonLocked.
1439fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // This method must be called with mMutex locked.
1451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void abandonLocked();
1461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1479fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // dumpLocked dumps the current state of the ConsumerBase object to the
1489fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // result string.  Each line is prefixed with the string pointed to by the
1499fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // prefix argument.  The buffer argument points to a buffer that may be
1509fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // used for intermediate formatting data, and the size of that buffer is
1519fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // indicated by the size argument.
1529fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1539fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to dump their internal
1549fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // state.  If this method is overridden the derived class's implementation
1559fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // should call ConsumerBase::dumpLocked.
1569fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1579fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // This method must be called with mMutex locked.
15874d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    virtual void dumpLocked(String8& result, const char* prefix) const;
1591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1601a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // acquireBufferLocked fetches the next buffer from the BufferQueue and
1611a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // updates the buffer slot for the buffer returned.
1629fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1639fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to perform any
1649fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // initialization that must take place the first time a buffer is assigned
1659fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // to a slot.  If it is overridden the derived class's implementation must
1669fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // call ConsumerBase::acquireBufferLocked.
167a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza    virtual status_t acquireBufferLocked(BufferItem *item, nsecs_t presentWhen,
168a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza            uint64_t maxFrameNumber = 0);
1691a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1701a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // releaseBufferLocked relinquishes control over a buffer, returning that
1711a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // control to the BufferQueue.
1729fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1739fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to perform any cleanup that
1749fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // must take place when a buffer is released back to the BufferQueue.  If
1759fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // it is overridden the derived class's implementation must call
176c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    // ConsumerBase::releaseBufferLocked.e
177c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    virtual status_t releaseBufferLocked(int slot,
178c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer,
179c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            EGLDisplay display, EGLSyncKHR eglFence);
180c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar
181c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    // returns true iff the slot still has the graphicBuffer in it.
182c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    bool stillTracking(int slot, const sp<GraphicBuffer> graphicBuffer);
183b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis
1849504eb915c9628e130f45019bdefda0168089886Jesse Hall    // addReleaseFence* adds the sync points associated with a fence to the set
185b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // of sync points that must be reached before the buffer in the given slot
186b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // may be used after the slot has been released.  This should be called by
187b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // derived classes each time some asynchronous work is kicked off that
188b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // references the buffer.
189c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    status_t addReleaseFence(int slot,
190c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
191c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    status_t addReleaseFenceLocked(int slot,
192c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
1931a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1941a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // Slot contains the information and object references that
1951a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // ConsumerBase maintains about a BufferQueue buffer slot.
1961a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    struct Slot {
1971a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // mGraphicBuffer is the Gralloc buffer store in the slot or NULL if
1981a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // no Gralloc buffer is in the slot.
1991a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        sp<GraphicBuffer> mGraphicBuffer;
2001a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2011a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // mFence is a fence which will signal when the buffer associated with
2021a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // this buffer slot is no longer being used by the consumer and can be
2031a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // overwritten. The buffer can be dequeued before the fence signals;
2041a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // the producer is responsible for delaying writes until it signals.
2051a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        sp<Fence> mFence;
206c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar
207c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar        // the frame number of the last acquired frame for this slot
208c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar        uint64_t mFrameNumber;
2091a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    };
2101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mSlots stores the buffers that have been allocated by the BufferQueue
2121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // for each buffer slot.  It is initialized to null pointers, and gets
2131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // filled in with the result of BufferQueue::acquire when the
2141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // client dequeues a buffer from a
2151a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // slot that has not yet been used. The buffer allocated to a slot will also
2161a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // be replaced if the requested buffer usage or geometry differs from that
2171a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // of the buffer allocated to a slot.
2181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    Slot mSlots[BufferQueue::NUM_BUFFER_SLOTS];
2191a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mAbandoned indicates that the BufferQueue will no longer be used to
2212adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    // consume images buffers pushed to it using the IGraphicBufferProducer
2221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // interface. It is initialized to false, and set to true in the abandon
2231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // method.  A BufferQueue that has been abandoned will return the NO_INIT
2241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // error from all IConsumerBase methods capable of returning an error.
2251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    bool mAbandoned;
2261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2271a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mName is a string used to identify the ConsumerBase in log messages.
2281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // It can be set by the setName method.
2291a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    String8 mName;
2301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mFrameAvailableListener is the listener object that will be called when a
2321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // new frame becomes available. If it is not NULL it will be called from
2331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // queueBuffer.
234a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin    wp<FrameAvailableListener> mFrameAvailableListener;
2351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // The ConsumerBase has-a BufferQueue and is responsible for creating this object
2371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // if none is supplied
238db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    sp<IGraphicBufferConsumer> mConsumer;
2391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mMutex is the mutex used to prevent concurrent access to the member
2411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // variables of ConsumerBase objects. It must be locked whenever the
2429fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // member variables are accessed or when any of the *Locked methods are
2439fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // called.
2449fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
2459fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // This mutex is intended to be locked by derived classes.
2461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    mutable Mutex mMutex;
2471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis};
2481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ----------------------------------------------------------------------------
2501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis}; // namespace android
2511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#endif // ANDROID_GUI_CONSUMERBASE_H
253