BufferLayer.h revision 41fdfc920e2a479add53a1936c3ae76cdbea41db
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
190c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "Client.h"
2041fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman#include "Layer.h"
210c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "DisplayHardware/HWComposer.h"
220c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "DisplayHardware/HWComposerBufferCache.h"
230c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "FrameTracker.h"
240c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "LayerVector.h"
250c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "MonitoredProducer.h"
260c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "RenderEngine/Mesh.h"
270c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "RenderEngine/Texture.h"
280c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "SurfaceFlinger.h"
290c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include "SurfaceFlingerConsumer.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 <EGL/egl.h>
360c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <EGL/eglext.h>
370c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
380c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/FrameStats.h>
390c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/GraphicBuffer.h>
400c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/PixelFormat.h>
410c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <ui/Region.h>
420c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
430c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/RefBase.h>
440c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/String8.h>
450c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <utils/Timers.h>
460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <stdint.h>
480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <sys/types.h>
490c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#include <list>
500c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
510c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmannamespace android {
520c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
530c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman/*
540c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * A new BufferQueue and a new SurfaceFlingerConsumer are created when the
550c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * BufferLayer is first referenced.
560c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman *
570c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * This also implements onFrameAvailable(), which notifies SurfaceFlinger
580c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman * that new data has arrived.
590c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman */
600c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanclass BufferLayer : public Layer, public SurfaceFlingerConsumer::ContentsChangedListener {
610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanpublic:
620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    BufferLayer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name, uint32_t w,
630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman                uint32_t h, uint32_t flags);
640c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
650c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    ~BufferLayer() override;
660c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
670c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // -----------------------------------------------------------------------
680c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Overriden from Layer
690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // -----------------------------------------------------------------------
700c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
710c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * getTypeId - Provide unique string for each class type in the Layer
730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * hierarchy
740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
750c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    const char* getTypeId() const override { return "BufferLayer"; }
760c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
780c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isProtected - true if the layer may contain protected content in the
790c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * GRALLOC_USAGE_PROTECTED sense.
800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isProtected() const;
820c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
830c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
840c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isVisible - true if this layer is visible, false otherwise
850c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
860c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isVisible() const override;
870c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
880c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
890c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * isFixedSize - true if content has a fixed size
900c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
910c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isFixedSize() const override;
920c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
930c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // the this layer's size and format
940c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
950c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
960c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
970c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * onDraw - draws the surface.
980c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
990c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onDraw(const RenderArea& renderArea, const Region& clip,
1000c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman                bool useIdentityTransform) const override;
1010c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1020c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool onPreComposition(nsecs_t refreshStartTime) override;
1030c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1040c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#ifdef USE_HWC2
1050c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // If a buffer was replaced this frame, release the former buffer
1060c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void releasePendingBuffer(nsecs_t dequeueReadyTime);
1070c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#endif
1080c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1090c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    /*
1100c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * latchBuffer - called each time the screen is redrawn and returns whether
1110c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * the visible regions need to be recomputed (this is a fairly heavy
1120c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * operation, so this should be set only if needed). Typically this is used
1130c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     * to figure out if the content or size of a surface has changed.
1140c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman     */
1150c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    Region latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) override;
1160c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isBufferLatched() const override { return mRefreshPending; }
1170c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1180c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#ifdef USE_HWC2
1190c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void setPerFrameData(const sp<const DisplayDevice>& displayDevice);
1200c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#else
12141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    void setPerFrameData(const sp<const DisplayDevice>& hw,
12241fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman                         HWComposer::HWCLayerInterface& layer);
1230c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman#endif
1240c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool isOpaque(const Layer::State& s) const override;
1250c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1260c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanprivate:
1270c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFirstRef() override;
1280c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1290c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Interface implementation for
1300c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // SurfaceFlingerConsumer::ContentsChangedListener
1310c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFrameAvailable(const BufferItem& item) override;
1320c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onFrameReplaced(const BufferItem& item) override;
1330c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void onSidebandStreamChanged() override;
1340c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1350c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // needsLinearFiltering - true if this surface's state requires filtering
1360c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool needsFiltering(const RenderArea& renderArea) const;
1370c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1380c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    static bool getOpacityForFormat(uint32_t format);
1390c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1400c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // drawing
14141fdfc920e2a479add53a1936c3ae76cdbea41dbDavid Sodman    void drawWithOpenGL(const RenderArea& renderArea, bool useIdentityTransform) const;
1420c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1430c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Temporary - Used only for LEGACY camera mode.
1440c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t getProducerStickyTransform() const;
1450c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1460c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Loads the corresponding system property once per process
1470c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    static bool latchUnsignaledBuffers();
1480c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1490c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint64_t getHeadFrameNumber() const;
1500c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool headFenceHasSignaled() const;
1510c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1520c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Returns the current scaling mode, unless mOverrideScalingMode
1530c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // is set, in which case, it returns mOverrideScalingMode
1540c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t getEffectiveScalingMode() const override;
1550c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1560c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanpublic:
1570c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    void notifyAvailableFrames() override;
1580c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1590c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    PixelFormat getPixelFormat() const override { return mFormat; }
1600c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    sp<IGraphicBufferProducer> getProducer() const;
1610c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1620c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodmanprivate:
1630c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // Check all of the local sync points to ensure that all transactions
1640c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // which need to have been applied prior to the frame which is about to
1650c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // be latched have signaled
1660c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool allTransactionsSignaled();
1670c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    sp<IGraphicBufferProducer> mProducer;
1680c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1690c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // constants
1700c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t mTextureName; // from GLES
1710c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    PixelFormat mFormat;
1720c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1730c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // main thread
1740c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint32_t mCurrentScalingMode;
1750c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mBufferLatched = false;   // TODO: Use mActiveBuffer?
1760c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    uint64_t mPreviousFrameNumber; // Only accessed on the main thread.
1770c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    // The texture used to draw the layer in GLES composition mode
1780c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    mutable Texture mTexture;
1790c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1800c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mUpdateTexImageFailed; // This is only accessed on the main thread.
1810c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman    bool mRefreshPending;
1820c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman};
1830c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman
1840c69cad13dda09f1df1dbf23810b1c5b7f28ba08David Sodman} // namespace android
185