| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 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 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 19 | #include "BufferLayer.h" | 
|  | 20 | #include "Layer.h" | 
|  | 21 |  | 
| Peiyong Lin | cbc184f | 2018-08-22 13:24:10 -0700 | [diff] [blame] | 22 | #include <renderengine/Image.h> | 
|  | 23 | #include <renderengine/RenderEngine.h> | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 24 | #include <system/window.h> | 
|  | 25 | #include <utils/String8.h> | 
|  | 26 |  | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 27 | #include <stack> | 
|  | 28 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 29 | namespace android { | 
|  | 30 |  | 
| Valerie Hau | 6449968 | 2019-04-10 11:04:29 -0700 | [diff] [blame] | 31 | class SlotGenerationTest; | 
|  | 32 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 33 | class BufferStateLayer : public BufferLayer { | 
|  | 34 | public: | 
| Lloyd Pique | 42ab75e | 2018-09-12 20:46:03 -0700 | [diff] [blame] | 35 | explicit BufferStateLayer(const LayerCreationArgs&); | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 36 |  | 
| Alec Mouri | 4545a8a | 2019-08-08 20:05:32 -0700 | [diff] [blame] | 37 | ~BufferStateLayer() override; | 
|  | 38 |  | 
| Peiyong Lin | f243e5e | 2020-08-22 17:40:59 -0700 | [diff] [blame] | 39 | // Implements Layer. | 
| chaviw | 8a01fa4 | 2019-08-19 12:39:31 -0700 | [diff] [blame] | 40 | const char* getType() const override { return "BufferStateLayer"; } | 
|  | 41 |  | 
| Sally Qi | 59a9f50 | 2021-10-12 18:53:23 +0000 | [diff] [blame] | 42 | void onLayerDisplayed( | 
|  | 43 | std::shared_future<renderengine::RenderEngineResult> futureRenderEngineResult) override; | 
|  | 44 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 45 | void releasePendingBuffer(nsecs_t dequeueReadyTime) override; | 
|  | 46 |  | 
| Valerie Hau | 871d635 | 2020-01-29 08:44:02 -0800 | [diff] [blame] | 47 | void finalizeFrameEventHistory(const std::shared_ptr<FenceTime>& glDoneFence, | 
|  | 48 | const CompositorTiming& compositorTiming) override; | 
|  | 49 |  | 
| Ady Abraham | 63a3e59 | 2021-01-06 10:47:15 -0800 | [diff] [blame] | 50 | bool isBufferDue(nsecs_t /*expectedPresentTime*/) const override { return true; } | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 51 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 52 | Region getActiveTransparentRegion(const Layer::State& s) const override { | 
|  | 53 | return s.transparentRegionHint; | 
|  | 54 | } | 
|  | 55 | Rect getCrop(const Layer::State& s) const; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 56 |  | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 57 | bool setTransform(uint32_t transform) override; | 
|  | 58 | bool setTransformToDisplayInverse(bool transformToDisplayInverse) override; | 
|  | 59 | bool setCrop(const Rect& crop) override; | 
| Vishnu Nair | dbbe385 | 2022-01-12 20:22:11 -0800 | [diff] [blame] | 60 | bool setBuffer(std::shared_ptr<renderengine::ExternalTexture>& /* buffer */, | 
|  | 61 | const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime, | 
| chaviw | ba4320c | 2021-09-15 15:20:53 -0500 | [diff] [blame] | 62 | bool isAutoTimestamp, std::optional<nsecs_t> dequeueTime, | 
|  | 63 | const FrameTimelineInfo& info) override; | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 64 | bool setDataspace(ui::Dataspace dataspace) override; | 
|  | 65 | bool setHdrMetadata(const HdrMetadata& hdrMetadata) override; | 
|  | 66 | bool setSurfaceDamageRegion(const Region& surfaceDamage) override; | 
|  | 67 | bool setApi(int32_t api) override; | 
|  | 68 | bool setSidebandStream(const sp<NativeHandle>& sidebandStream) override; | 
| Jiakai Zhang | a5505cb | 2021-11-09 11:46:30 +0000 | [diff] [blame] | 69 | bool setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>>& handles) override; | 
| Valerie Hau | 871d635 | 2020-01-29 08:44:02 -0800 | [diff] [blame] | 70 | bool addFrameEvent(const sp<Fence>& acquireFence, nsecs_t postedTime, | 
|  | 71 | nsecs_t requestedPresentTime) override; | 
| Chavi Weingarten | a5aedbd | 2021-04-09 13:37:33 +0000 | [diff] [blame] | 72 | bool setPosition(float /*x*/, float /*y*/) override; | 
| Robert Carr | de6d7b4 | 2022-01-07 18:23:06 -0800 | [diff] [blame] | 73 | bool setMatrix(const layer_state_t::matrix22_t& /*matrix*/); | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 74 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 75 | // Override to ignore legacy layer state properties that are not used by BufferStateLayer | 
| Marissa Wall | 861616d | 2018-10-22 12:52:23 -0700 | [diff] [blame] | 76 | bool setSize(uint32_t /*w*/, uint32_t /*h*/) override { return false; } | 
| Marissa Wall | 861616d | 2018-10-22 12:52:23 -0700 | [diff] [blame] | 77 | bool setTransparentRegionHint(const Region& transparent) override; | 
| Marissa Wall | 861616d | 2018-10-22 12:52:23 -0700 | [diff] [blame] | 78 |  | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 79 | Rect getBufferSize(const State& s) const override; | 
| Vishnu Nair | 4351ad5 | 2019-02-11 14:13:02 -0800 | [diff] [blame] | 80 | FloatRect computeSourceBounds(const FloatRect& parentBounds) const override; | 
| Vishnu Nair | cf26a0a | 2020-11-13 12:56:20 -0800 | [diff] [blame] | 81 | void setAutoRefresh(bool autoRefresh) override; | 
| Valerie Hau | bc6ddb1 | 2019-03-08 11:10:15 -0800 | [diff] [blame] | 82 |  | 
| chaviw | f3f40fe | 2021-04-27 15:54:02 -0500 | [diff] [blame] | 83 | bool setBufferCrop(const Rect& bufferCrop) override; | 
| Vishnu Nair | 6bdec7d | 2021-05-10 15:01:13 -0700 | [diff] [blame] | 84 | bool setDestinationFrame(const Rect& destinationFrame) override; | 
| Robert Carr | 6a16031 | 2021-05-17 12:08:20 -0700 | [diff] [blame] | 85 | bool updateGeometry() override; | 
| chaviw | f3f40fe | 2021-04-27 15:54:02 -0500 | [diff] [blame] | 86 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 87 | // ----------------------------------------------------------------------- | 
|  | 88 |  | 
|  | 89 | // ----------------------------------------------------------------------- | 
|  | 90 | // Interface implementation for BufferLayer | 
|  | 91 | // ----------------------------------------------------------------------- | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 92 | bool fenceHasSignaled() const override; | 
| Dominik Laskowski | a8955dd | 2019-07-10 10:19:09 -0700 | [diff] [blame] | 93 | bool framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const override; | 
| Valerie Hau | 871d635 | 2020-01-29 08:44:02 -0800 | [diff] [blame] | 94 | bool onPreComposition(nsecs_t refreshStartTime) override; | 
| Robert Carr | 916b036 | 2020-10-06 13:53:03 -0700 | [diff] [blame] | 95 | uint32_t getEffectiveScalingMode() const override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 96 |  | 
| Robert Carr | 7121caf | 2020-12-15 13:07:32 -0800 | [diff] [blame] | 97 | // See mPendingBufferTransactions | 
| Robert Carr | 7121caf | 2020-12-15 13:07:32 -0800 | [diff] [blame] | 98 | void decrementPendingBufferCount(); | 
| Vishnu Nair | 8eda69e | 2021-02-26 10:42:10 -0800 | [diff] [blame] | 99 | std::atomic<int32_t>* getPendingBufferCounter() override { return &mPendingBufferTransactions; } | 
|  | 100 | std::string getPendingBufferCounterName() override { return mBlastTransactionName; } | 
| Robert Carr | 7121caf | 2020-12-15 13:07:32 -0800 | [diff] [blame] | 101 |  | 
| Robert Carr | 6a5dc1f | 2021-03-11 12:36:40 -0800 | [diff] [blame] | 102 | bool shouldPresentNow(nsecs_t /*expectedPresentTime*/) const override { return true; } | 
|  | 103 |  | 
| chaviw | 4244e03 | 2019-09-04 11:27:49 -0700 | [diff] [blame] | 104 | protected: | 
|  | 105 | void gatherBufferInfo() override; | 
| Jorim Jaggi | 9c03b50 | 2020-11-24 23:51:31 +0100 | [diff] [blame] | 106 | void onSurfaceFrameCreated(const std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame); | 
| chaviw | 39d0147 | 2021-04-08 14:26:24 -0500 | [diff] [blame] | 107 | ui::Transform getInputTransform() const override; | 
|  | 108 | Rect getInputBounds() const override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 109 |  | 
| chaviw | 4244e03 | 2019-09-04 11:27:49 -0700 | [diff] [blame] | 110 | private: | 
| Peiyong Lin | f243e5e | 2020-08-22 17:40:59 -0700 | [diff] [blame] | 111 | friend class SlotGenerationTest; | 
| Adithya Srinivasan | b238cd5 | 2021-02-04 17:54:05 +0000 | [diff] [blame] | 112 | friend class TransactionFrameTracerTest; | 
| Adithya Srinivasan | b9a7dab | 2021-01-14 23:49:46 +0000 | [diff] [blame] | 113 | friend class TransactionSurfaceFrameTest; | 
|  | 114 |  | 
| Vishnu Nair | 8eda69e | 2021-02-26 10:42:10 -0800 | [diff] [blame] | 115 | inline void tracePendingBufferCount(int32_t pendingBuffers); | 
| Peiyong Lin | f243e5e | 2020-08-22 17:40:59 -0700 | [diff] [blame] | 116 |  | 
| Valerie Hau | bf78464 | 2020-01-29 07:25:23 -0800 | [diff] [blame] | 117 | bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime, | 
|  | 118 | nsecs_t requestedPresentTime); | 
|  | 119 |  | 
| Vishnu Nair | 6194e2e | 2019-02-06 12:58:39 -0800 | [diff] [blame] | 120 | bool latchSidebandStream(bool& recomputeVisibleRegions) override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 121 |  | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 122 | bool hasFrameUpdate() const override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 123 |  | 
| Dominik Laskowski | a8955dd | 2019-07-10 10:19:09 -0700 | [diff] [blame] | 124 | status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime, | 
|  | 125 | nsecs_t expectedPresentTime) override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 126 |  | 
| Lloyd Pique | 0449b0f | 2018-12-20 16:23:45 -0800 | [diff] [blame] | 127 | status_t updateActiveBuffer() override; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 128 | status_t updateFrameNumber(nsecs_t latchTime) override; | 
|  | 129 |  | 
| chaviw | b4c6e58 | 2019-08-16 14:35:07 -0700 | [diff] [blame] | 130 | sp<Layer> createClone() override; | 
| Dominik Laskowski | 075d317 | 2018-05-24 15:50:06 -0700 | [diff] [blame] | 131 |  | 
| chaviw | 4244e03 | 2019-09-04 11:27:49 -0700 | [diff] [blame] | 132 | // Crop that applies to the buffer | 
| Vishnu Nair | 5cc9ac0 | 2021-04-19 13:23:38 -0700 | [diff] [blame] | 133 | Rect computeBufferCrop(const State& s); | 
| chaviw | 4244e03 | 2019-09-04 11:27:49 -0700 | [diff] [blame] | 134 |  | 
| Marissa Wall | e2ffb42 | 2018-10-12 11:33:52 -0700 | [diff] [blame] | 135 | bool willPresentCurrentTransaction() const; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 136 |  | 
| Vishnu Nair | e7f79c5 | 2020-10-29 14:45:03 -0700 | [diff] [blame] | 137 | bool bufferNeedsFiltering() const override; | 
|  | 138 |  | 
| Ady Abraham | 9dada82 | 2022-02-03 10:26:59 -0800 | [diff] [blame] | 139 | bool simpleBufferUpdate(const layer_state_t& s) const override; | 
|  | 140 |  | 
| Vishnu Nair | 4ba0c2e | 2021-06-24 11:27:17 -0700 | [diff] [blame] | 141 | ReleaseCallbackId mPreviousReleaseCallbackId = ReleaseCallbackId::INVALID_ID; | 
| Mikael Pessa | 2e1608f | 2019-07-19 11:25:35 -0700 | [diff] [blame] | 142 | uint64_t mPreviousReleasedFrameNumber = 0; | 
| Marissa Wall | fda30bb | 2018-10-12 11:34:28 -0700 | [diff] [blame] | 143 |  | 
| Robert Carr | 79dc06a | 2022-02-22 15:28:59 -0800 | [diff] [blame] | 144 | uint64_t mPreviousBarrierFrameNumber = 0; | 
|  | 145 |  | 
| Marissa Wall | fda30bb | 2018-10-12 11:34:28 -0700 | [diff] [blame] | 146 | bool mReleasePreviousBuffer = false; | 
| Vishnu Nair | 1506b18 | 2021-02-22 14:35:15 -0800 | [diff] [blame] | 147 |  | 
|  | 148 | // Stores the last set acquire fence signal time used to populate the callback handle's acquire | 
|  | 149 | // time. | 
| Ady Abraham | 461296a | 2022-01-21 11:11:31 -0800 | [diff] [blame] | 150 | std::variant<nsecs_t, sp<Fence>> mCallbackHandleAcquireTimeOrFence = -1; | 
| Marissa Wall | 024a191 | 2018-08-13 13:55:35 -0700 | [diff] [blame] | 151 |  | 
| Jorim Jaggi | 9c03b50 | 2020-11-24 23:51:31 +0100 | [diff] [blame] | 152 | std::deque<std::shared_ptr<android::frametimeline::SurfaceFrame>> mPendingJankClassifications; | 
| Adithya Srinivasan | d17c7da | 2021-03-05 20:43:32 +0000 | [diff] [blame] | 153 | // An upper bound on the number of SurfaceFrames in the pending classifications deque. | 
|  | 154 | static constexpr int kPendingClassificationMaxSurfaceFrames = 25; | 
| Jorim Jaggi | 9c03b50 | 2020-11-24 23:51:31 +0100 | [diff] [blame] | 155 |  | 
| Robert Carr | 7121caf | 2020-12-15 13:07:32 -0800 | [diff] [blame] | 156 | const std::string mBlastTransactionName{"BufferTX - " + mName}; | 
|  | 157 | // This integer is incremented everytime a buffer arrives at the server for this layer, | 
|  | 158 | // and decremented when a buffer is dropped or latched. When changed the integer is exported | 
|  | 159 | // to systrace with ATRACE_INT and mBlastTransactionName. This way when debugging perf it is | 
|  | 160 | // possible to see when a buffer arrived at the server, and in which frame it latched. | 
|  | 161 | // | 
|  | 162 | // You can understand the trace this way: | 
|  | 163 | //     - If the integer increases, a buffer arrived at the server. | 
|  | 164 | //     - If the integer decreases in latchBuffer, that buffer was latched | 
|  | 165 | //     - If the integer decreases in setBuffer or doTransaction, a buffer was dropped | 
| Vishnu Nair | 8eda69e | 2021-02-26 10:42:10 -0800 | [diff] [blame] | 166 | std::atomic<int32_t> mPendingBufferTransactions{0}; | 
| Robert Carr | 7121caf | 2020-12-15 13:07:32 -0800 | [diff] [blame] | 167 |  | 
| Vishnu Nair | 6bdec7d | 2021-05-10 15:01:13 -0700 | [diff] [blame] | 168 | // Contains requested position and matrix updates. This will be applied if the client does | 
|  | 169 | // not specify a destination frame. | 
|  | 170 | ui::Transform mRequestedTransform; | 
|  | 171 |  | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 172 | // TODO(marissaw): support sticky transform for LEGACY camera mode | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 173 |  | 
|  | 174 | class HwcSlotGenerator : public ClientCache::ErasedRecipient { | 
|  | 175 | public: | 
|  | 176 | HwcSlotGenerator() { | 
| rnlee | ed20fa4 | 2021-08-10 18:00:03 -0700 | [diff] [blame] | 177 | for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 178 | mFreeHwcCacheSlots.push(i); | 
|  | 179 | } | 
|  | 180 | } | 
|  | 181 |  | 
|  | 182 | void bufferErased(const client_cache_t& clientCacheId); | 
|  | 183 |  | 
| rnlee | ed20fa4 | 2021-08-10 18:00:03 -0700 | [diff] [blame] | 184 | int getHwcCacheSlot(const client_cache_t& clientCacheId); | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 185 |  | 
|  | 186 | private: | 
| Valerie Hau | 6449968 | 2019-04-10 11:04:29 -0700 | [diff] [blame] | 187 | friend class SlotGenerationTest; | 
| rnlee | ed20fa4 | 2021-08-10 18:00:03 -0700 | [diff] [blame] | 188 | int addCachedBuffer(const client_cache_t& clientCacheId) REQUIRES(mMutex); | 
|  | 189 | int getFreeHwcCacheSlot() REQUIRES(mMutex); | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 190 | void evictLeastRecentlyUsed() REQUIRES(mMutex); | 
|  | 191 | void eraseBufferLocked(const client_cache_t& clientCacheId) REQUIRES(mMutex); | 
|  | 192 |  | 
|  | 193 | struct CachedBufferHash { | 
|  | 194 | std::size_t operator()(const client_cache_t& clientCacheId) const { | 
|  | 195 | return std::hash<uint64_t>{}(clientCacheId.id); | 
|  | 196 | } | 
|  | 197 | }; | 
|  | 198 |  | 
|  | 199 | std::mutex mMutex; | 
|  | 200 |  | 
| rnlee | ed20fa4 | 2021-08-10 18:00:03 -0700 | [diff] [blame] | 201 | std::unordered_map<client_cache_t, std::pair<int /*HwcCacheSlot*/, uint64_t /*counter*/>, | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 202 | CachedBufferHash> | 
|  | 203 | mCachedBuffers GUARDED_BY(mMutex); | 
| rnlee | ed20fa4 | 2021-08-10 18:00:03 -0700 | [diff] [blame] | 204 | std::stack<int /*HwcCacheSlot*/> mFreeHwcCacheSlots GUARDED_BY(mMutex); | 
| Marissa Wall | 947d34e | 2019-03-29 14:03:53 -0700 | [diff] [blame] | 205 |  | 
|  | 206 | // The cache increments this counter value when a slot is updated or used. | 
|  | 207 | // Used to track the least recently-used buffer | 
|  | 208 | uint64_t mCounter = 0; | 
|  | 209 | }; | 
|  | 210 |  | 
|  | 211 | sp<HwcSlotGenerator> mHwcSlotGenerator; | 
| Marissa Wall | 61c5862 | 2018-07-18 10:12:20 -0700 | [diff] [blame] | 212 | }; | 
|  | 213 |  | 
|  | 214 | } // namespace android |