/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "BufferLayer.h" #include namespace android { /* * A new BufferQueue and a new BufferLayerConsumer are created when the * BufferLayer is first referenced. * * This also implements onFrameAvailable(), which notifies SurfaceFlinger * that new data has arrived. */ class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener { public: explicit BufferQueueLayer(const LayerCreationArgs&); ~BufferQueueLayer() override; // ----------------------------------------------------------------------- // Interface implementation for Layer // ----------------------------------------------------------------------- public: void onLayerDisplayed(const sp& releaseFence) override; void setTransformHint(uint32_t orientation) const override; std::vector getOccupancyHistory(bool forceFlush) override; bool getTransformToDisplayInverse() const override; // If a buffer was replaced this frame, release the former buffer void releasePendingBuffer(nsecs_t dequeueReadyTime) override; void setDefaultBufferSize(uint32_t w, uint32_t h) override; int32_t getQueuedFrameCount() const override; bool shouldPresentNow(nsecs_t expectedPresentTime) const override; // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // Interface implementation for BufferLayer // ----------------------------------------------------------------------- public: bool fenceHasSignaled() const override; bool framePresentTimeIsCurrent() const override; private: nsecs_t getDesiredPresentTime() override; std::shared_ptr getCurrentFenceTime() const override; void getDrawingTransformMatrix(float *matrix) override; uint32_t getDrawingTransform() const override; ui::Dataspace getDrawingDataSpace() const override; Rect getDrawingCrop() const override; uint32_t getDrawingScalingMode() const override; Region getDrawingSurfaceDamage() const override; const HdrMetadata& getDrawingHdrMetadata() const override; int getDrawingApi() const override; uint64_t getFrameNumber() const override; bool getAutoRefresh() const override; bool getSidebandStreamChanged() const override; bool latchSidebandStream(bool& recomputeVisibleRegions) override; bool hasFrameUpdate() const override; void setFilteringEnabled(bool enabled) override; status_t bindTextureImage() override; status_t updateTexImage(bool& recomputeVisibleRegions, nsecs_t latchTime) override; status_t updateActiveBuffer() override; status_t updateFrameNumber(nsecs_t latchTime) override; void setHwcLayerBuffer(const sp& displayDevice) override; // ----------------------------------------------------------------------- // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- protected: void onFrameAvailable(const BufferItem& item) override; void onFrameReplaced(const BufferItem& item) override; void onSidebandStreamChanged() override; // ----------------------------------------------------------------------- public: status_t setDefaultBufferProperties(uint32_t w, uint32_t h, PixelFormat format); sp getProducer() const; private: // Temporary - Used only for LEGACY camera mode. uint32_t getProducerStickyTransform() const; void onFirstRef() override; sp mConsumer; sp mProducer; // Only accessed on the main thread. uint64_t mPreviousFrameNumber{0}; bool mUpdateTexImageFailed{false}; // Local copy of the queued contents of the incoming BufferQueue mutable Mutex mQueueItemLock; Condition mQueueItemCondition; Vector mQueueItems; std::atomic mLastFrameNumberReceived{0}; bool mAutoRefresh{false}; int mActiveBufferSlot{BufferQueue::INVALID_BUFFER_SLOT}; // thread-safe std::atomic mQueuedFrames{0}; std::atomic mSidebandStreamChanged{false}; void fakeVsync(); }; } // namespace android