xref: /aosp_15_r20/frameworks/native/include/gui/BufferQueue.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_GUI_BUFFERQUEUE_H
18*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_GUI_BUFFERQUEUE_H
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <gui/BufferItem.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <gui/BufferQueueDefs.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker #include <gui/IConsumerListener.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <gui/IGraphicBufferConsumer.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include <com_android_graphics_libgui_flags.h>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker namespace android {
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker class BufferQueue {
32*38e8c45fSAndroid Build Coastguard Worker public:
33*38e8c45fSAndroid Build Coastguard Worker     // BufferQueue will keep track of at most this value of buffers.
34*38e8c45fSAndroid Build Coastguard Worker     // Attempts at runtime to increase the number of buffers past this will fail.
35*38e8c45fSAndroid Build Coastguard Worker     enum { NUM_BUFFER_SLOTS = BufferQueueDefs::NUM_BUFFER_SLOTS };
36*38e8c45fSAndroid Build Coastguard Worker     // Used as a placeholder slot# when the value isn't pointing to an existing buffer.
37*38e8c45fSAndroid Build Coastguard Worker     enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };
38*38e8c45fSAndroid Build Coastguard Worker     // Alias to <IGraphicBufferConsumer.h> -- please scope from there in future code!
39*38e8c45fSAndroid Build Coastguard Worker     enum {
40*38e8c45fSAndroid Build Coastguard Worker         NO_BUFFER_AVAILABLE = IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
41*38e8c45fSAndroid Build Coastguard Worker         PRESENT_LATER = IGraphicBufferConsumer::PRESENT_LATER,
42*38e8c45fSAndroid Build Coastguard Worker     };
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker     // When in async mode we reserve two slots in order to guarantee that the
45*38e8c45fSAndroid Build Coastguard Worker     // producer and consumer can run asynchronously.
46*38e8c45fSAndroid Build Coastguard Worker     enum { MAX_MAX_ACQUIRED_BUFFERS = NUM_BUFFER_SLOTS - 2 };
47*38e8c45fSAndroid Build Coastguard Worker 
48*38e8c45fSAndroid Build Coastguard Worker     // for backward source compatibility
49*38e8c45fSAndroid Build Coastguard Worker     typedef ::android::ConsumerListener ConsumerListener;
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker     // ProxyConsumerListener is a ConsumerListener implementation that keeps a weak
52*38e8c45fSAndroid Build Coastguard Worker     // reference to the actual consumer object.  It forwards all calls to that
53*38e8c45fSAndroid Build Coastguard Worker     // consumer object so long as it exists.
54*38e8c45fSAndroid Build Coastguard Worker     //
55*38e8c45fSAndroid Build Coastguard Worker     // This class exists to avoid having a circular reference between the
56*38e8c45fSAndroid Build Coastguard Worker     // BufferQueue object and the consumer object.  The reason this can't be a weak
57*38e8c45fSAndroid Build Coastguard Worker     // reference in the BufferQueue class is because we're planning to expose the
58*38e8c45fSAndroid Build Coastguard Worker     // consumer side of a BufferQueue as a binder interface, which doesn't support
59*38e8c45fSAndroid Build Coastguard Worker     // weak references.
60*38e8c45fSAndroid Build Coastguard Worker     class ProxyConsumerListener : public BnConsumerListener {
61*38e8c45fSAndroid Build Coastguard Worker     public:
62*38e8c45fSAndroid Build Coastguard Worker         explicit ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
63*38e8c45fSAndroid Build Coastguard Worker         ~ProxyConsumerListener() override;
64*38e8c45fSAndroid Build Coastguard Worker         void onDisconnect() override;
65*38e8c45fSAndroid Build Coastguard Worker         void onFrameAvailable(const BufferItem& item) override;
66*38e8c45fSAndroid Build Coastguard Worker         void onFrameReplaced(const BufferItem& item) override;
67*38e8c45fSAndroid Build Coastguard Worker         void onBuffersReleased() override;
68*38e8c45fSAndroid Build Coastguard Worker         void onSidebandStreamChanged() override;
69*38e8c45fSAndroid Build Coastguard Worker         void onFrameDequeued(const uint64_t bufferId) override;
70*38e8c45fSAndroid Build Coastguard Worker         void onFrameCancelled(const uint64_t bufferId) override;
71*38e8c45fSAndroid Build Coastguard Worker         void onFrameDetached(const uint64_t bufferID) override;
72*38e8c45fSAndroid Build Coastguard Worker         void addAndGetFrameTimestamps(
73*38e8c45fSAndroid Build Coastguard Worker                 const NewFrameEventsEntry* newTimestamps,
74*38e8c45fSAndroid Build Coastguard Worker                 FrameEventHistoryDelta* outDelta) override;
75*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_SETFRAMERATE)
76*38e8c45fSAndroid Build Coastguard Worker         void onSetFrameRate(float frameRate, int8_t compatibility,
77*38e8c45fSAndroid Build Coastguard Worker                             int8_t changeFrameRateStrategy) override;
78*38e8c45fSAndroid Build Coastguard Worker #endif
79*38e8c45fSAndroid Build Coastguard Worker     private:
80*38e8c45fSAndroid Build Coastguard Worker         // mConsumerListener is a weak reference to the IConsumerListener.  This is
81*38e8c45fSAndroid Build Coastguard Worker         // the raison d'etre of ProxyConsumerListener.
82*38e8c45fSAndroid Build Coastguard Worker         wp<ConsumerListener> mConsumerListener;
83*38e8c45fSAndroid Build Coastguard Worker     };
84*38e8c45fSAndroid Build Coastguard Worker 
85*38e8c45fSAndroid Build Coastguard Worker     // BufferQueue manages a pool of gralloc memory slots to be used by
86*38e8c45fSAndroid Build Coastguard Worker     // producers and consumers. allocator is used to allocate all the
87*38e8c45fSAndroid Build Coastguard Worker     // needed gralloc buffers.
88*38e8c45fSAndroid Build Coastguard Worker     static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
89*38e8c45fSAndroid Build Coastguard Worker             sp<IGraphicBufferConsumer>* outConsumer,
90*38e8c45fSAndroid Build Coastguard Worker             bool consumerIsSurfaceFlinger = false);
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker     BufferQueue() = delete; // Create through createBufferQueue
93*38e8c45fSAndroid Build Coastguard Worker };
94*38e8c45fSAndroid Build Coastguard Worker 
95*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
96*38e8c45fSAndroid Build Coastguard Worker }; // namespace android
97*38e8c45fSAndroid Build Coastguard Worker 
98*38e8c45fSAndroid Build Coastguard Worker #endif // ANDROID_GUI_BUFFERQUEUE_H
99