1 /*
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 
23 namespace 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  */
32 class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener {
33 public:
34     explicit BufferQueueLayer(const LayerCreationArgs&);
35     ~BufferQueueLayer() override;
36 
37     // -----------------------------------------------------------------------
38     // Interface implementation for Layer
39     // -----------------------------------------------------------------------
40 public:
41     void onLayerDisplayed(const sp<Fence>& releaseFence) override;
42 
43     void setTransformHint(uint32_t orientation) const override;
44 
45     std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override;
46 
47     bool getTransformToDisplayInverse() const override;
48 
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 
56     bool shouldPresentNow(nsecs_t expectedPresentTime) const override;
57     // -----------------------------------------------------------------------
58 
59     // -----------------------------------------------------------------------
60     // Interface implementation for BufferLayer
61     // -----------------------------------------------------------------------
62 public:
63     bool fenceHasSignaled() const override;
64     bool framePresentTimeIsCurrent() const override;
65 
66 private:
67     nsecs_t getDesiredPresentTime() override;
68     std::shared_ptr<FenceTime> getCurrentFenceTime() const override;
69 
70     void getDrawingTransformMatrix(float *matrix) override;
71     uint32_t getDrawingTransform() const override;
72     ui::Dataspace getDrawingDataSpace() const override;
73     Rect getDrawingCrop() const override;
74     uint32_t getDrawingScalingMode() const override;
75     Region getDrawingSurfaceDamage() const override;
76     const HdrMetadata& getDrawingHdrMetadata() const override;
77     int getDrawingApi() const override;
78 
79     uint64_t getFrameNumber() const override;
80 
81     bool getAutoRefresh() const override;
82     bool getSidebandStreamChanged() const override;
83 
84     bool latchSidebandStream(bool& recomputeVisibleRegions) override;
85 
86     bool hasFrameUpdate() const override;
87 
88     void setFilteringEnabled(bool enabled) override;
89 
90     status_t bindTextureImage() override;
91     status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime) override;
92 
93     status_t updateActiveBuffer() override;
94     status_t updateFrameNumber(nsecs_t latchTime) override;
95 
96     void setHwcLayerBuffer(const sp<const DisplayDevice>& displayDevice) override;
97 
98     // -----------------------------------------------------------------------
99     // Interface implementation for BufferLayerConsumer::ContentsChangedListener
100     // -----------------------------------------------------------------------
101 protected:
102     void onFrameAvailable(const BufferItem& item) override;
103     void onFrameReplaced(const BufferItem& item) override;
104     void onSidebandStreamChanged() override;
105     // -----------------------------------------------------------------------
106 
107 public:
108     status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format);
109 
110     sp<IGraphicBufferProducer> getProducer() const;
111 
112 private:
113     // Temporary - Used only for LEGACY camera mode.
114     uint32_t getProducerStickyTransform() const;
115 
116     void onFirstRef() override;
117 
118     sp<BufferLayerConsumer> mConsumer;
119     sp<IGraphicBufferProducer> mProducer;
120 
121     // Only accessed on the main thread.
122     uint64_t mPreviousFrameNumber{0};
123     bool mUpdateTexImageFailed{false};
124 
125     // Local copy of the queued contents of the incoming BufferQueue
126     mutable Mutex mQueueItemLock;
127     Condition mQueueItemCondition;
128     Vector<BufferItem> mQueueItems;
129     std::atomic<uint64_t> mLastFrameNumberReceived{0};
130 
131     bool mAutoRefresh{false};
132     int mActiveBufferSlot{BufferQueue::INVALID_BUFFER_SLOT};
133 
134     // thread-safe
135     std::atomic<int32_t> mQueuedFrames{0};
136     std::atomic<bool> mSidebandStreamChanged{false};
137 
138     void fakeVsync();
139 };
140 
141 } // namespace android
142