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 PixelFormat getPixelFormat() const override; 79 80 uint64_t getFrameNumber() const override; 81 82 bool getAutoRefresh() const override; 83 bool getSidebandStreamChanged() const override; 84 85 bool latchSidebandStream(bool& recomputeVisibleRegions) override; 86 87 bool hasFrameUpdate() const override; 88 89 void setFilteringEnabled(bool enabled) override; 90 91 status_t bindTextureImage() override; 92 status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime) override; 93 94 status_t updateActiveBuffer() override; 95 status_t updateFrameNumber(nsecs_t latchTime) override; 96 97 void setHwcLayerBuffer(const sp<const DisplayDevice>& displayDevice) override; 98 99 // ----------------------------------------------------------------------- 100 // Interface implementation for BufferLayerConsumer::ContentsChangedListener 101 // ----------------------------------------------------------------------- 102 protected: 103 void onFrameAvailable(const BufferItem& item) override; 104 void onFrameReplaced(const BufferItem& item) override; 105 void onSidebandStreamChanged() override; 106 // ----------------------------------------------------------------------- 107 108 public: 109 status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format); 110 111 sp<IGraphicBufferProducer> getProducer() const; 112 113 private: 114 // Temporary - Used only for LEGACY camera mode. 115 uint32_t getProducerStickyTransform() const; 116 117 void onFirstRef() override; 118 119 sp<BufferLayerConsumer> mConsumer; 120 sp<IGraphicBufferProducer> mProducer; 121 122 PixelFormat mFormat{PIXEL_FORMAT_NONE}; 123 124 // Only accessed on the main thread. 125 uint64_t mPreviousFrameNumber{0}; 126 bool mUpdateTexImageFailed{false}; 127 128 // Local copy of the queued contents of the incoming BufferQueue 129 mutable Mutex mQueueItemLock; 130 Condition mQueueItemCondition; 131 Vector<BufferItem> mQueueItems; 132 std::atomic<uint64_t> mLastFrameNumberReceived{0}; 133 134 bool mAutoRefresh{false}; 135 int mActiveBufferSlot{BufferQueue::INVALID_BUFFER_SLOT}; 136 137 // thread-safe 138 std::atomic<int32_t> mQueuedFrames{0}; 139 std::atomic<bool> mSidebandStreamChanged{false}; 140 141 void fakeVsync(); 142 }; 143 144 } // namespace android 145