10c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman/*
20c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * Copyright (C) 2017 The Android Open Source Project
30c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *
40c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * Licensed under the Apache License, Version 2.0 (the "License");
50c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * you may not use this file except in compliance with the License.
60c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * You may obtain a copy of the License at
70c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *
80c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *      http://www.apache.org/licenses/LICENSE-2.0
90c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *
100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * Unless required by applicable law or agreed to in writing, software
110c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * distributed under the License is distributed on an "AS IS" BASIS,
120c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * See the License for the specific language governing permissions and
140c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * limitations under the License.
150c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman */
160c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
170c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#pragma once
180c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
190cb75ac1daa903c04054aea50869076047b09897Chia-I Wu#include "BufferLayerConsumer.h"
200c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "Client.h"
2141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "Layer.h"
220c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "DisplayHardware/HWComposer.h"
230c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "DisplayHardware/HWComposerBufferCache.h"
240c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "FrameTracker.h"
250c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "LayerVector.h"
260c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "MonitoredProducer.h"
270c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "RenderEngine/Mesh.h"
280c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "RenderEngine/Texture.h"
290c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "SurfaceFlinger.h"
300c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "Transform.h"
310c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
320c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <gui/ISurfaceComposerClient.h>
330c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <gui/LayerState.h>
340c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
350c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/FrameStats.h>
360c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/GraphicBuffer.h>
370c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/PixelFormat.h>
380c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/Region.h>
390c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
400c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/RefBase.h>
410c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/String8.h>
420c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/Timers.h>
430c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
440c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <stdint.h>
450c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <sys/types.h>
460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <list>
470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmannamespace android {
490c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
500c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman/*
510cb75ac1daa903c04054aea50869076047b09897Chia-I Wu * A new BufferQueue and a new BufferLayerConsumer are created when the
520c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * BufferLayer is first referenced.
530c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *
540c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * This also implements onFrameAvailable(), which notifies SurfaceFlinger
550c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * that new data has arrived.
560c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman */
570cb75ac1daa903c04054aea50869076047b09897Chia-I Wuclass BufferLayer : public Layer, public BufferLayerConsumer::ContentsChangedListener {
580c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanpublic:
590c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    BufferLayer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
600c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman                uint32_t h, uint32_t flags);
610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    ~BufferLayer() override;
630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
64eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    // If we have received a new buffer this frame, we will pass its surface
65eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    // damage down to hardware composer. Otherwise, we must send a region with
66eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    // one empty rect.
67eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void useSurfaceDamage();
68eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void useEmptyDamage();
69eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
700c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // -----------------------------------------------------------------------
710c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Overriden from Layer
720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // -----------------------------------------------------------------------
730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
750c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * getTypeId - Provide unique string for each class type in the Layer
760c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * hierarchy
770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
780c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    const char* getTypeId() const override { return "BufferLayer"; }
790c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isProtected - true if the layer may contain protected content in the
820c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * GRALLOC_USAGE_PROTECTED sense.
830c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
840c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isProtected() const;
850c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
860c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
870c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isVisible - true if this layer is visible, false otherwise
880c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
890c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isVisible() const override;
900c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
910c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
920c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isFixedSize - true if content has a fixed size
930c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
940c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isFixedSize() const override;
950c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
960c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // the this layer's size and format
970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
980c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
990c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
1000c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * onDraw - draws the surface.
1010c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
1020c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onDraw(const RenderArea& renderArea, const Region& clip,
1030c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman                bool useIdentityTransform) const override;
1040c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
105eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void onLayerDisplayed(const sp<Fence>& releaseFence) override;
106eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
107eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void abandon() override;
108eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    bool shouldPresentNow(const DispSync& dispSync) const override;
109eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void setTransformHint(uint32_t orientation) const override;
110eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    bool onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
111eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman                           const std::shared_ptr<FenceTime>& presentFence,
112eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman                           const CompositorTiming& compositorTiming) override;
113eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override;
114eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    bool getTransformToDisplayInverse() const override;
115eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
116eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodmanpublic:
1170c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool onPreComposition(nsecs_t refreshStartTime) override;
1180c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1190c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // If a buffer was replaced this frame, release the former buffer
1200c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void releasePendingBuffer(nsecs_t dequeueReadyTime);
1210c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1220c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
1230c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * latchBuffer - called each time the screen is redrawn and returns whether
1240c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * the visible regions need to be recomputed (this is a fairly heavy
1250c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * operation, so this should be set only if needed). Typically this is used
1260c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * to figure out if the content or size of a surface has changed.
1270c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
1280c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    Region latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) override;
1290c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isBufferLatched() const override { return mRefreshPending; }
130eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void setDefaultBufferSize(uint32_t w, uint32_t h) override;
1310c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
13207376a98a6c66c4e48bdebe82616f0ae47e5f805Chia-I Wu    bool isHdrY410() const override;
13307376a98a6c66c4e48bdebe82616f0ae47e5f805Chia-I Wu
134eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman    void setPerFrameData(const sp<const DisplayDevice>& displayDevice) override;
135eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
1360c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isOpaque(const Layer::State& s) const override;
1370c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1380c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanprivate:
1390c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFirstRef() override;
1400c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1410c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Interface implementation for
1420cb75ac1daa903c04054aea50869076047b09897Chia-I Wu    // BufferLayerConsumer::ContentsChangedListener
1430c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFrameAvailable(const BufferItem& item) override;
1440c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFrameReplaced(const BufferItem& item) override;
1450c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onSidebandStreamChanged() override;
1460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // needsLinearFiltering - true if this surface's state requires filtering
1480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool needsFiltering(const RenderArea& renderArea) const;
1490c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1500c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    static bool getOpacityForFormat(uint32_t format);
1510c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1520c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // drawing
15341fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    void drawWithOpenGL(const RenderArea& renderArea, bool useIdentityTransform) const;
1540c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1550c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Temporary - Used only for LEGACY camera mode.
1560c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t getProducerStickyTransform() const;
1570c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1580c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Loads the corresponding system property once per process
1590c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    static bool latchUnsignaledBuffers();
1600c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint64_t getHeadFrameNumber() const;
1620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool headFenceHasSignaled() const;
1630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1640c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Returns the current scaling mode, unless mOverrideScalingMode
1650c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // is set, in which case, it returns mOverrideScalingMode
1660c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t getEffectiveScalingMode() const override;
1670c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1680c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanpublic:
1690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void notifyAvailableFrames() override;
1700c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1710c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    PixelFormat getPixelFormat() const override { return mFormat; }
1720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    sp<IGraphicBufferProducer> getProducer() const;
1730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanprivate:
175b28c6742fa7ce8ff69eebf6b15140730066135d3Chia-I Wu    sp<BufferLayerConsumer> mConsumer;
176eb085e0c579f310e2670204b14b742b68c70bc9eDavid Sodman
1770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Check all of the local sync points to ensure that all transactions
1780c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // which need to have been applied prior to the frame which is about to
1790c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // be latched have signaled
1800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool allTransactionsSignaled();
1810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    sp<IGraphicBufferProducer> mProducer;
1820c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1830c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // constants
1840c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t mTextureName; // from GLES
1850c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    PixelFormat mFormat;
1860c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1870c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // main thread
1880c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t mCurrentScalingMode;
1890c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mBufferLatched = false;   // TODO: Use mActiveBuffer?
1900c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint64_t mPreviousFrameNumber; // Only accessed on the main thread.
1910c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // The texture used to draw the layer in GLES composition mode
1920c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mutable Texture mTexture;
1930c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1940c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mUpdateTexImageFailed; // This is only accessed on the main thread.
1950c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mRefreshPending;
1960c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman};
1970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1980c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman} // namespace android
199