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