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