blob: d392a699b3d7d3fc9aa623d55595b6032cee667c [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 */
32class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener {
33public:
Lloyd Pique42ab75e2018-09-12 20:46:03 -070034 explicit BufferQueueLayer(const LayerCreationArgs&);
35 ~BufferQueueLayer() override;
Marissa Wallfd668622018-05-10 10:21:13 -070036
37 // -----------------------------------------------------------------------
38 // Interface implementation for Layer
39 // -----------------------------------------------------------------------
40public:
41 void onLayerDisplayed(const sp<Fence>& releaseFence) override;
42
Marissa Wallfd668622018-05-10 10:21:13 -070043 void setTransformHint(uint32_t orientation) const override;
44
45 std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override;
46
Lloyd Pique0449b0f2018-12-20 16:23:45 -080047 bool getTransformToDisplayInverse() const override;
Marissa Wallfd668622018-05-10 10:21:13 -070048
49 // 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
Ana Krulec010d2192018-10-08 06:29:54 -070056 bool shouldPresentNow(nsecs_t expectedPresentTime) const override;
Marissa Wallfd668622018-05-10 10:21:13 -070057 // -----------------------------------------------------------------------
58
59 // -----------------------------------------------------------------------
60 // Interface implementation for BufferLayer
61 // -----------------------------------------------------------------------
62public:
63 bool fenceHasSignaled() const override;
64
Alec Mourie7d1d4a2019-02-05 01:13:46 +000065protected:
66 bool useCachedBufferForClientComposition() const override;
67
Marissa Wallfd668622018-05-10 10:21:13 -070068private:
69 nsecs_t getDesiredPresentTime() override;
Lloyd Pique0449b0f2018-12-20 16:23:45 -080070 std::shared_ptr<FenceTime> getCurrentFenceTime() const override;
Marissa Wallfd668622018-05-10 10:21:13 -070071
Marissa Wall61c58622018-07-18 10:12:20 -070072 void getDrawingTransformMatrix(float *matrix) override;
Lloyd Pique0449b0f2018-12-20 16:23:45 -080073 uint32_t getDrawingTransform() const override;
74 ui::Dataspace getDrawingDataSpace() const override;
75 Rect getDrawingCrop() const override;
Marissa Wallfd668622018-05-10 10:21:13 -070076 uint32_t getDrawingScalingMode() const override;
77 Region getDrawingSurfaceDamage() const override;
78 const HdrMetadata& getDrawingHdrMetadata() const override;
79 int getDrawingApi() const override;
80 PixelFormat getPixelFormat() const override;
81
82 uint64_t getFrameNumber() const override;
83
84 bool getAutoRefresh() const override;
85 bool getSidebandStreamChanged() const override;
86
Vishnu Nair6194e2e2019-02-06 12:58:39 -080087 bool latchSidebandStream(bool& recomputeVisibleRegions) override;
Marissa Wallfd668622018-05-10 10:21:13 -070088
Lloyd Pique0449b0f2018-12-20 16:23:45 -080089 bool hasFrameUpdate() const override;
Marissa Wallfd668622018-05-10 10:21:13 -070090
Marissa Wall61c58622018-07-18 10:12:20 -070091 void setFilteringEnabled(bool enabled) override;
Marissa Wallfd668622018-05-10 10:21:13 -070092
Alec Mouri39801c02018-10-10 10:44:47 -070093 status_t bindTextureImage() override;
Alec Mouri86770e52018-09-24 22:40:58 +000094 status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime,
Lloyd Pique0449b0f2018-12-20 16:23:45 -080095 const sp<Fence>& releaseFence) override;
Marissa Wallfd668622018-05-10 10:21:13 -070096
Lloyd Pique0449b0f2018-12-20 16:23:45 -080097 status_t updateActiveBuffer() override;
Marissa Wallfd668622018-05-10 10:21:13 -070098 status_t updateFrameNumber(nsecs_t latchTime) override;
99
Dominik Laskowski075d3172018-05-24 15:50:06 -0700100 void setHwcLayerBuffer(DisplayId displayId) override;
Marissa Wallfd668622018-05-10 10:21:13 -0700101
102 // -----------------------------------------------------------------------
103 // Interface implementation for BufferLayerConsumer::ContentsChangedListener
104 // -----------------------------------------------------------------------
105protected:
106 void onFrameAvailable(const BufferItem& item) override;
107 void onFrameReplaced(const BufferItem& item) override;
108 void onSidebandStreamChanged() override;
109 // -----------------------------------------------------------------------
110
111public:
112 status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format);
113
114 sp<IGraphicBufferProducer> getProducer() const;
115
116private:
117 // Temporary - Used only for LEGACY camera mode.
118 uint32_t getProducerStickyTransform() const;
119
120 void onFirstRef() override;
121
122 sp<BufferLayerConsumer> mConsumer;
123 sp<IGraphicBufferProducer> mProducer;
124
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700125 PixelFormat mFormat{PIXEL_FORMAT_NONE};
Marissa Wallfd668622018-05-10 10:21:13 -0700126
127 // Only accessed on the main thread.
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700128 uint64_t mPreviousFrameNumber{0};
129 bool mUpdateTexImageFailed{false};
Marissa Wallfd668622018-05-10 10:21:13 -0700130
131 // Local copy of the queued contents of the incoming BufferQueue
132 mutable Mutex mQueueItemLock;
133 Condition mQueueItemCondition;
134 Vector<BufferItem> mQueueItems;
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700135 std::atomic<uint64_t> mLastFrameNumberReceived{0};
Marissa Wallfd668622018-05-10 10:21:13 -0700136
Lloyd Pique42ab75e2018-09-12 20:46:03 -0700137 bool mAutoRefresh{false};
138 int mActiveBufferSlot{BufferQueue::INVALID_BUFFER_SLOT};
Marissa Wallfd668622018-05-10 10:21:13 -0700139
140 // thread-safe
Lloyd Piquef1c675b2018-09-12 20:45:39 -0700141 std::atomic<int32_t> mQueuedFrames{0};
142 std::atomic<bool> mSidebandStreamChanged{false};
chaviwf206b662019-01-11 13:07:19 -0800143
144 void fakeVsync();
Marissa Wallfd668622018-05-10 10:21:13 -0700145};
146
147} // namespace android