blob: 0e8fdbe0926b6a6ff04ee611c225a346929b97c7 [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
Adithya Srinivasan5f683cf2020-09-15 14:21:04 -070025namespace frametimeline {
26class SurfaceFrame;
27}
28
Marissa Wallfd668622018-05-10 10:21:13 -070029/*
30 * A new BufferQueue and a new BufferLayerConsumer are created when the
31 * BufferLayer is first referenced.
32 *
33 * This also implements onFrameAvailable(), which notifies SurfaceFlinger
34 * that new data has arrived.
35 */
chaviw2d9a4292019-12-02 16:00:24 -080036class BufferQueueLayer : public BufferLayer {
Marissa Wallfd668622018-05-10 10:21:13 -070037public:
chaviwb4c6e582019-08-16 14:35:07 -070038 // Only call while mStateLock is held
Lloyd Pique42ab75e2018-09-12 20:46:03 -070039 explicit BufferQueueLayer(const LayerCreationArgs&);
40 ~BufferQueueLayer() override;
Marissa Wallfd668622018-05-10 10:21:13 -070041
Peiyong Linf243e5e2020-08-22 17:40:59 -070042 // Implements Layer.
chaviw8a01fa42019-08-19 12:39:31 -070043 const char* getType() const override { return "BufferQueueLayer"; }
44
Marissa Wallfd668622018-05-10 10:21:13 -070045 void onLayerDisplayed(const sp<Fence>& releaseFence) override;
46
Marissa Wallfd668622018-05-10 10:21:13 -070047 std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override;
48
Marissa Wallfd668622018-05-10 10:21:13 -070049 // If a buffer was replaced this frame, release the former buffer
50 void releasePendingBuffer(nsecs_t dequeueReadyTime) override;
51
52 void setDefaultBufferSize(uint32_t w, uint32_t h) override;
53
54 int32_t getQueuedFrameCount() const override;
55
Ady Abraham63a3e592021-01-06 10:47:15 -080056 // Returns true if the next buffer should be presented at the expected present time
57 bool isBufferDue(nsecs_t expectedPresentTime) const override;
Steven Thomas3172e202020-01-06 19:25:30 -080058
Peiyong Linf243e5e2020-08-22 17:40:59 -070059 // Implements BufferLayer.
Marissa Wallfd668622018-05-10 10:21:13 -070060 bool fenceHasSignaled() const override;
Dominik Laskowskia8955dd2019-07-10 10:19:09 -070061 bool framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const override;
Marissa Wallfd668622018-05-10 10:21:13 -070062
Peiyong Linf243e5e2020-08-22 17:40:59 -070063 status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format);
64 sp<IGraphicBufferProducer> getProducer() const;
chaviw2d9a4292019-12-02 16:00:24 -080065
Marissa Wallfd668622018-05-10 10:21:13 -070066protected:
chaviw4244e032019-09-04 11:27:49 -070067 void gatherBufferInfo() override;
68
chaviw2d9a4292019-12-02 16:00:24 -080069 // -----------------------------------------------------------------------
70 // Interface implementation for BufferLayerConsumer::ContentsChangedListener
71 // -----------------------------------------------------------------------
72 class ContentsChangedListener : public BufferLayerConsumer::ContentsChangedListener {
73 public:
74 ContentsChangedListener(BufferQueueLayer* bufferQueueLayer)
75 : mBufferQueueLayer(bufferQueueLayer) {}
76 void abandon();
77
78 protected:
79 void onFrameAvailable(const BufferItem& item) override;
80 void onFrameReplaced(const BufferItem& item) override;
81 void onSidebandStreamChanged() override;
82 void onFrameDequeued(const uint64_t bufferId) override;
83 void onFrameDetached(const uint64_t bufferId) override;
84 void onFrameCancelled(const uint64_t bufferId) override;
85
86 private:
87 BufferQueueLayer* mBufferQueueLayer = nullptr;
88 Mutex mMutex;
89 };
Marissa Wallfd668622018-05-10 10:21:13 -070090
91private:
Peiyong Linf243e5e2020-08-22 17:40:59 -070092 uint64_t getFrameNumber(nsecs_t expectedPresentTime) const override;
93
Peiyong Linf243e5e2020-08-22 17:40:59 -070094 bool latchSidebandStream(bool& recomputeVisibleRegions) override;
95 void setTransformHint(ui::Transform::RotationFlags displayTransformHint) override;
96
97 bool hasFrameUpdate() const override;
98
Peiyong Linf243e5e2020-08-22 17:40:59 -070099 status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime,
100 nsecs_t expectedPresentTime) override;
101
102 status_t updateActiveBuffer() override;
103 status_t updateFrameNumber(nsecs_t latchTime) override;
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700104 void setFrameTimelineVsyncForBuffer(int64_t frameTimelineVsyncId) override;
Peiyong Linf243e5e2020-08-22 17:40:59 -0700105
106 sp<Layer> createClone() override;
Marissa Wallfd668622018-05-10 10:21:13 -0700107
108 void onFirstRef() override;
109
Peiyong Linf243e5e2020-08-22 17:40:59 -0700110 void onFrameAvailable(const BufferItem& item);
111 void onFrameReplaced(const BufferItem& item);
112 void onSidebandStreamChanged();
113 void onFrameDequeued(const uint64_t bufferId);
114 void onFrameDetached(const uint64_t bufferId);
115 void onFrameCancelled(const uint64_t bufferId);
116
117 // Temporary - Used only for LEGACY camera mode.
118 uint32_t getProducerStickyTransform() const;
119
Ady Abraham63a3e592021-01-06 10:47:15 -0800120 std::optional<nsecs_t> nextPredictedPresentTime() const override;
Ady Abrahamce4adf12020-12-15 18:45:12 -0800121
Marissa Wallfd668622018-05-10 10:21:13 -0700122 sp<BufferLayerConsumer> mConsumer;
123 sp<IGraphicBufferProducer> mProducer;
124
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700125 bool mUpdateTexImageFailed{false};
Marissa Wallfd668622018-05-10 10:21:13 -0700126
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700127 uint64_t mPreviousBufferId = 0;
128 uint64_t mPreviousReleasedFrameNumber = 0;
129
Marissa Wallfd668622018-05-10 10:21:13 -0700130 // Local copy of the queued contents of the incoming BufferQueue
131 mutable Mutex mQueueItemLock;
132 Condition mQueueItemCondition;
Adithya Srinivasan5f683cf2020-09-15 14:21:04 -0700133
134 struct BufferData {
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100135 BufferData(BufferItem item, std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame)
136 : item(item), surfaceFrame(surfaceFrame) {}
Adithya Srinivasan5f683cf2020-09-15 14:21:04 -0700137 BufferItem item;
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100138 std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame;
Adithya Srinivasan5f683cf2020-09-15 14:21:04 -0700139 };
140 std::vector<BufferData> mQueueItems;
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700141 std::atomic<uint64_t> mLastFrameNumberReceived{0};
Marissa Wallfd668622018-05-10 10:21:13 -0700142
Marissa Wallfd668622018-05-10 10:21:13 -0700143 // thread-safe
Lloyd Piquef1c675b2018-09-12 20:45:39 -0700144 std::atomic<int32_t> mQueuedFrames{0};
chaviw2d9a4292019-12-02 16:00:24 -0800145
146 sp<ContentsChangedListener> mContentsChangedListener;
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700147
148 // The last vsync id received on this layer. This will be used when we get
149 // a buffer to correlate the buffer with the vsync id. Can only be accessed
150 // with the SF state lock held.
151 std::optional<int64_t> mFrameTimelineVsyncId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800152
153 // Keeps track of the time SF latched the last buffer from this layer.
154 // Used in buffer stuffing analysis in FrameTimeline.
155 // TODO(b/176106798): Find a way to do this for BLASTBufferQueue as well.
156 nsecs_t mLastLatchTime = 0;
Marissa Wallfd668622018-05-10 10:21:13 -0700157};
158
159} // namespace android