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