blob: 5f7587c5470759713490a61a41b1c6c8c43e9e5a [file] [log] [blame]
Marissa Wallfd668622018-05-10 10:21:13 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "BufferLayer.h"
20
21#include <utils/String8.h>
22
23namespace android {
24
25/*
26 * A new BufferQueue and a new BufferLayerConsumer are created when the
27 * BufferLayer is first referenced.
28 *
29 * This also implements onFrameAvailable(), which notifies SurfaceFlinger
30 * that new data has arrived.
31 */
chaviw2d9a4292019-12-02 16:00:24 -080032class BufferQueueLayer : public BufferLayer {
Marissa Wallfd668622018-05-10 10:21:13 -070033public:
chaviwb4c6e582019-08-16 14:35:07 -070034 // Only call while mStateLock is held
Lloyd Pique42ab75e2018-09-12 20:46:03 -070035 explicit BufferQueueLayer(const LayerCreationArgs&);
36 ~BufferQueueLayer() override;
Marissa Wallfd668622018-05-10 10:21:13 -070037
38 // -----------------------------------------------------------------------
39 // Interface implementation for Layer
40 // -----------------------------------------------------------------------
41public:
chaviw8a01fa42019-08-19 12:39:31 -070042 const char* getType() const override { return "BufferQueueLayer"; }
43
Marissa Wallfd668622018-05-10 10:21:13 -070044 void onLayerDisplayed(const sp<Fence>& releaseFence) override;
45
Marissa Wallfd668622018-05-10 10:21:13 -070046 void setTransformHint(uint32_t orientation) const override;
47
48 std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override;
49
Marissa Wallfd668622018-05-10 10:21:13 -070050 // If a buffer was replaced this frame, release the former buffer
51 void releasePendingBuffer(nsecs_t dequeueReadyTime) override;
52
53 void setDefaultBufferSize(uint32_t w, uint32_t h) override;
54
55 int32_t getQueuedFrameCount() const override;
56
Ana Krulec010d2192018-10-08 06:29:54 -070057 bool shouldPresentNow(nsecs_t expectedPresentTime) const override;
Steven Thomas3172e202020-01-06 19:25:30 -080058
Marissa Wallfd668622018-05-10 10:21:13 -070059 // -----------------------------------------------------------------------
60
61 // -----------------------------------------------------------------------
62 // Interface implementation for BufferLayer
63 // -----------------------------------------------------------------------
64public:
65 bool fenceHasSignaled() const override;
Dominik Laskowskia8955dd2019-07-10 10:19:09 -070066 bool framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const override;
Marissa Wallfd668622018-05-10 10:21:13 -070067
68private:
Dominik Laskowskia8955dd2019-07-10 10:19:09 -070069 uint64_t getFrameNumber(nsecs_t expectedPresentTime) const override;
Marissa Wallfd668622018-05-10 10:21:13 -070070
71 bool getAutoRefresh() const override;
72 bool getSidebandStreamChanged() const override;
73
Vishnu Nair6194e2e2019-02-06 12:58:39 -080074 bool latchSidebandStream(bool& recomputeVisibleRegions) override;
Marissa Wallfd668622018-05-10 10:21:13 -070075
Lloyd Pique0449b0f2018-12-20 16:23:45 -080076 bool hasFrameUpdate() const override;
Marissa Wallfd668622018-05-10 10:21:13 -070077
Alec Mouri39801c02018-10-10 10:44:47 -070078 status_t bindTextureImage() override;
Dominik Laskowskia8955dd2019-07-10 10:19:09 -070079 status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime,
80 nsecs_t expectedPresentTime) override;
Marissa Wallfd668622018-05-10 10:21:13 -070081
Lloyd Pique0449b0f2018-12-20 16:23:45 -080082 status_t updateActiveBuffer() override;
Marissa Wallfd668622018-05-10 10:21:13 -070083 status_t updateFrameNumber(nsecs_t latchTime) override;
84
Lloyd Piquede196652020-01-22 17:29:58 -080085 void preparePerFrameCompositionState() override;
chaviwb4c6e582019-08-16 14:35:07 -070086 sp<Layer> createClone() override;
Marissa Wallfd668622018-05-10 10:21:13 -070087
chaviw2d9a4292019-12-02 16:00:24 -080088 void onFrameAvailable(const BufferItem& item);
89 void onFrameReplaced(const BufferItem& item);
90 void onSidebandStreamChanged();
91 void onFrameDequeued(const uint64_t bufferId);
92 void onFrameDetached(const uint64_t bufferId);
93 void onFrameCancelled(const uint64_t bufferId);
94
Marissa Wallfd668622018-05-10 10:21:13 -070095protected:
chaviw4244e032019-09-04 11:27:49 -070096 void gatherBufferInfo() override;
97
chaviw2d9a4292019-12-02 16:00:24 -080098 // -----------------------------------------------------------------------
99 // Interface implementation for BufferLayerConsumer::ContentsChangedListener
100 // -----------------------------------------------------------------------
101 class ContentsChangedListener : public BufferLayerConsumer::ContentsChangedListener {
102 public:
103 ContentsChangedListener(BufferQueueLayer* bufferQueueLayer)
104 : mBufferQueueLayer(bufferQueueLayer) {}
105 void abandon();
106
107 protected:
108 void onFrameAvailable(const BufferItem& item) override;
109 void onFrameReplaced(const BufferItem& item) override;
110 void onSidebandStreamChanged() override;
111 void onFrameDequeued(const uint64_t bufferId) override;
112 void onFrameDetached(const uint64_t bufferId) override;
113 void onFrameCancelled(const uint64_t bufferId) override;
114
115 private:
116 BufferQueueLayer* mBufferQueueLayer = nullptr;
117 Mutex mMutex;
118 };
Marissa Wallfd668622018-05-10 10:21:13 -0700119 // -----------------------------------------------------------------------
120
121public:
122 status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format);
123
124 sp<IGraphicBufferProducer> getProducer() const;
125
126private:
127 // Temporary - Used only for LEGACY camera mode.
128 uint32_t getProducerStickyTransform() const;
129
130 void onFirstRef() override;
131
132 sp<BufferLayerConsumer> mConsumer;
133 sp<IGraphicBufferProducer> mProducer;
134
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700135 PixelFormat mFormat{PIXEL_FORMAT_NONE};
Marissa Wallfd668622018-05-10 10:21:13 -0700136
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700137 bool mUpdateTexImageFailed{false};
Marissa Wallfd668622018-05-10 10:21:13 -0700138
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700139 uint64_t mPreviousBufferId = 0;
140 uint64_t mPreviousReleasedFrameNumber = 0;
141
Marissa Wallfd668622018-05-10 10:21:13 -0700142 // Local copy of the queued contents of the incoming BufferQueue
143 mutable Mutex mQueueItemLock;
144 Condition mQueueItemCondition;
145 Vector<BufferItem> mQueueItems;
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700146 std::atomic<uint64_t> mLastFrameNumberReceived{0};
Marissa Wallfd668622018-05-10 10:21:13 -0700147
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700148 bool mAutoRefresh{false};
Marissa Wallfd668622018-05-10 10:21:13 -0700149
150 // thread-safe
Lloyd Piquef1c675b2018-09-12 20:45:39 -0700151 std::atomic<int32_t> mQueuedFrames{0};
152 std::atomic<bool> mSidebandStreamChanged{false};
chaviw2d9a4292019-12-02 16:00:24 -0800153
154 sp<ContentsChangedListener> mContentsChangedListener;
Marissa Wallfd668622018-05-10 10:21:13 -0700155};
156
157} // namespace android