1 2 /* 3 * Copyright (C) 2007 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #pragma once 19 20 #include <android/gui/DropInputMode.h> 21 #include <compositionengine/LayerFE.h> 22 #include <gui/BufferQueue.h> 23 #include <gui/ISurfaceComposerClient.h> 24 #include <gui/LayerState.h> 25 #include <gui/WindowInfo.h> 26 #include <layerproto/LayerProtoHeader.h> 27 #include <math/vec4.h> 28 #include <renderengine/Mesh.h> 29 #include <renderengine/Texture.h> 30 #include <sys/types.h> 31 #include <ui/BlurRegion.h> 32 #include <ui/FloatRect.h> 33 #include <ui/FrameStats.h> 34 #include <ui/GraphicBuffer.h> 35 #include <ui/PixelFormat.h> 36 #include <ui/Region.h> 37 #include <ui/StretchEffect.h> 38 #include <ui/Transform.h> 39 #include <utils/RefBase.h> 40 #include <utils/Timers.h> 41 42 #include <chrono> 43 #include <cstdint> 44 #include <list> 45 #include <optional> 46 #include <vector> 47 48 #include "Client.h" 49 #include "ClientCache.h" 50 #include "DisplayHardware/ComposerHal.h" 51 #include "DisplayHardware/HWComposer.h" 52 #include "Fps.h" 53 #include "FrameTracker.h" 54 #include "LayerVector.h" 55 #include "MonitoredProducer.h" 56 #include "RenderArea.h" 57 #include "Scheduler/LayerInfo.h" 58 #include "Scheduler/Seamlessness.h" 59 #include "SurfaceFlinger.h" 60 #include "SurfaceTracing.h" 61 #include "TransactionCallbackInvoker.h" 62 63 using namespace android::surfaceflinger; 64 65 namespace android { 66 67 class Client; 68 class Colorizer; 69 class DisplayDevice; 70 class GraphicBuffer; 71 class SurfaceFlinger; 72 class LayerDebugInfo; 73 74 namespace compositionengine { 75 class OutputLayer; 76 struct LayerFECompositionState; 77 } 78 79 namespace impl { 80 class SurfaceInterceptor; 81 } 82 83 namespace frametimeline { 84 class SurfaceFrame; 85 } // namespace frametimeline 86 87 struct LayerCreationArgs { 88 LayerCreationArgs(SurfaceFlinger*, sp<Client>, std::string name, uint32_t w, uint32_t h, 89 uint32_t flags, LayerMetadata); 90 91 SurfaceFlinger* flinger; 92 const sp<Client> client; 93 std::string name; 94 uint32_t w; 95 uint32_t h; 96 uint32_t flags; 97 LayerMetadata metadata; 98 99 pid_t callingPid; 100 uid_t callingUid; 101 uint32_t textureName; 102 }; 103 104 class Layer : public virtual RefBase, compositionengine::LayerFE { 105 static std::atomic<int32_t> sSequence; 106 // The following constants represent priority of the window. SF uses this information when 107 // deciding which window has a priority when deciding about the refresh rate of the screen. 108 // Priority 0 is considered the highest priority. -1 means that the priority is unset. 109 static constexpr int32_t PRIORITY_UNSET = -1; 110 // Windows that are in focus and voted for the preferred mode ID 111 static constexpr int32_t PRIORITY_FOCUSED_WITH_MODE = 0; 112 // // Windows that are in focus, but have not requested a specific mode ID. 113 static constexpr int32_t PRIORITY_FOCUSED_WITHOUT_MODE = 1; 114 // Windows that are not in focus, but voted for a specific mode ID. 115 static constexpr int32_t PRIORITY_NOT_FOCUSED_WITH_MODE = 2; 116 117 public: 118 enum { // flags for doTransaction() 119 eDontUpdateGeometryState = 0x00000001, 120 eVisibleRegion = 0x00000002, 121 eInputInfoChanged = 0x00000004 122 }; 123 124 struct Geometry { 125 uint32_t w; 126 uint32_t h; 127 ui::Transform transform; 128 129 inline bool operator==(const Geometry& rhs) const { 130 return (w == rhs.w && h == rhs.h) && (transform.tx() == rhs.transform.tx()) && 131 (transform.ty() == rhs.transform.ty()); 132 } 133 inline bool operator!=(const Geometry& rhs) const { return !operator==(rhs); } 134 }; 135 136 struct RoundedCornerState { 137 RoundedCornerState() = default; RoundedCornerStateRoundedCornerState138 RoundedCornerState(FloatRect cropRect, float radius) 139 : cropRect(cropRect), radius(radius) {} 140 141 // Rounded rectangle in local layer coordinate space. 142 FloatRect cropRect = FloatRect(); 143 // Radius of the rounded rectangle. 144 float radius = 0.0f; 145 }; 146 147 using FrameRate = scheduler::LayerInfo::FrameRate; 148 using FrameRateCompatibility = scheduler::LayerInfo::FrameRateCompatibility; 149 150 struct State { 151 Geometry active_legacy; 152 Geometry requested_legacy; 153 int32_t z; 154 155 // The identifier of the layer stack this layer belongs to. A layer can 156 // only be associated to a single layer stack. A layer stack is a 157 // z-ordered group of layers which can be associated to one or more 158 // displays. Using the same layer stack on different displays is a way 159 // to achieve mirroring. 160 uint32_t layerStack; 161 162 uint32_t flags; 163 uint8_t reserved[2]; 164 int32_t sequence; // changes when visible regions can change 165 bool modified; 166 167 // Crop is expressed in layer space coordinate. 168 Rect crop; 169 Rect requestedCrop; 170 171 // the transparentRegion hint is a bit special, it's latched only 172 // when we receive a buffer -- this is because it's "content" 173 // dependent. 174 Region activeTransparentRegion_legacy; 175 Region requestedTransparentRegion_legacy; 176 177 LayerMetadata metadata; 178 179 // If non-null, a Surface this Surface's Z-order is interpreted relative to. 180 wp<Layer> zOrderRelativeOf; 181 bool isRelativeOf{false}; 182 183 // A list of surfaces whose Z-order is interpreted relative to ours. 184 SortedVector<wp<Layer>> zOrderRelatives; 185 186 half4 color; 187 float cornerRadius; 188 int backgroundBlurRadius; 189 190 gui::WindowInfo inputInfo; 191 wp<Layer> touchableRegionCrop; 192 193 // dataspace is only used by BufferStateLayer and EffectLayer 194 ui::Dataspace dataspace; 195 196 // The fields below this point are only used by BufferStateLayer 197 uint64_t frameNumber; 198 uint32_t width; 199 uint32_t height; 200 ui::Transform transform; 201 202 uint32_t bufferTransform; 203 bool transformToDisplayInverse; 204 205 Region transparentRegionHint; 206 207 std::shared_ptr<renderengine::ExternalTexture> buffer; 208 client_cache_t clientCacheId; 209 sp<Fence> acquireFence; 210 std::shared_ptr<FenceTime> acquireFenceTime; 211 HdrMetadata hdrMetadata; 212 Region surfaceDamageRegion; 213 int32_t api; 214 215 sp<NativeHandle> sidebandStream; 216 mat4 colorTransform; 217 bool hasColorTransform; 218 219 // pointer to background color layer that, if set, appears below the buffer state layer 220 // and the buffer state layer's children. Z order will be set to 221 // INT_MIN 222 sp<Layer> bgColorLayer; 223 224 // The deque of callback handles for this frame. The back of the deque contains the most 225 // recent callback handle. 226 std::deque<sp<CallbackHandle>> callbackHandles; 227 bool colorSpaceAgnostic; 228 nsecs_t desiredPresentTime = 0; 229 bool isAutoTimestamp = true; 230 231 // Length of the cast shadow. If the radius is > 0, a shadow of length shadowRadius will 232 // be rendered around the layer. 233 float shadowRadius; 234 235 // Layer regions that are made of custom materials, like frosted glass 236 std::vector<BlurRegion> blurRegions; 237 238 // Priority of the layer assigned by Window Manager. 239 int32_t frameRateSelectionPriority; 240 241 FrameRate frameRate; 242 243 // The combined frame rate of parents / children of this layer 244 FrameRate frameRateForLayerTree; 245 246 // Set by window manager indicating the layer and all its children are 247 // in a different orientation than the display. The hint suggests that 248 // the graphic producers should receive a transform hint as if the 249 // display was in this orientation. When the display changes to match 250 // the layer orientation, the graphic producer may not need to allocate 251 // a buffer of a different size. ui::Transform::ROT_INVALID means the 252 // a fixed transform hint is not set. 253 ui::Transform::RotationFlags fixedTransformHint; 254 255 // The vsync info that was used to start the transaction 256 FrameTimelineInfo frameTimelineInfo; 257 258 // When the transaction was posted 259 nsecs_t postTime; 260 261 sp<ITransactionCompletedListener> releaseBufferListener; 262 // SurfaceFrame that tracks the timeline of Transactions that contain a Buffer. Only one 263 // such SurfaceFrame exists because only one buffer can be presented on the layer per vsync. 264 // If multiple buffers are queued, the prior ones will be dropped, along with the 265 // SurfaceFrame that's tracking them. 266 std::shared_ptr<frametimeline::SurfaceFrame> bufferSurfaceFrameTX; 267 // A map of token(frametimelineVsyncId) to the SurfaceFrame that's tracking a transaction 268 // that contains the token. Only one SurfaceFrame exisits for transactions that share the 269 // same token, unless they are presented in different vsyncs. 270 std::unordered_map<int64_t, std::shared_ptr<frametimeline::SurfaceFrame>> 271 bufferlessSurfaceFramesTX; 272 // An arbitrary threshold for the number of BufferlessSurfaceFrames in the state. Used to 273 // trigger a warning if the number of SurfaceFrames crosses the threshold. 274 static constexpr uint32_t kStateSurfaceFramesThreshold = 25; 275 276 // Stretch effect to apply to this layer 277 StretchEffect stretchEffect; 278 279 // Whether or not this layer is a trusted overlay for input 280 bool isTrustedOverlay; 281 282 Rect bufferCrop; 283 Rect destinationFrame; 284 285 sp<IBinder> releaseBufferEndpoint; 286 287 gui::DropInputMode dropInputMode; 288 }; 289 290 /* 291 * Trivial class, used to ensure that mFlinger->onLayerDestroyed(mLayer) 292 * is called. 293 */ 294 class LayerCleaner { 295 sp<SurfaceFlinger> mFlinger; 296 sp<Layer> mLayer; 297 BBinder* mHandle; 298 299 protected: ~LayerCleaner()300 ~LayerCleaner() { 301 // destroy client resources 302 mFlinger->onHandleDestroyed(mHandle, mLayer); 303 } 304 305 public: LayerCleaner(const sp<SurfaceFlinger> & flinger,const sp<Layer> & layer,BBinder * handle)306 LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer, BBinder* handle) 307 : mFlinger(flinger), mLayer(layer), mHandle(handle) {} 308 }; 309 310 /* 311 * The layer handle is just a BBinder object passed to the client 312 * (remote process) -- we don't keep any reference on our side such that 313 * the dtor is called when the remote side let go of its reference. 314 * 315 * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for 316 * this layer when the handle is destroyed. 317 */ 318 class Handle : public BBinder, public LayerCleaner { 319 public: Handle(const sp<SurfaceFlinger> & flinger,const sp<Layer> & layer)320 Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) 321 : LayerCleaner(flinger, layer, this), owner(layer) {} getInterfaceDescriptor()322 const String16& getInterfaceDescriptor() const override { return kDescriptor; } 323 324 static const String16 kDescriptor; 325 wp<Layer> owner; 326 }; 327 328 static wp<Layer> fromHandle(const sp<IBinder>& handle); 329 330 explicit Layer(const LayerCreationArgs& args); 331 virtual ~Layer(); 332 333 static bool isLayerFocusedBasedOnPriority(int32_t priority); 334 static void miniDumpHeader(std::string& result); 335 static std::string frameRateCompatibilityString(FrameRateCompatibility compatibility); 336 337 // Provide unique string for each class type in the Layer hierarchy 338 virtual const char* getType() const = 0; 339 340 // true if this layer is visible, false otherwise 341 virtual bool isVisible() const = 0; 342 343 virtual sp<Layer> createClone() = 0; 344 345 // Geometry setting functions. 346 // 347 // The following group of functions are used to specify the layers 348 // bounds, and the mapping of the texture on to those bounds. According 349 // to various settings changes to them may apply immediately, or be delayed until 350 // a pending resize is completed by the producer submitting a buffer. For example 351 // if we were to change the buffer size, and update the matrix ahead of the 352 // new buffer arriving, then we would be stretching the buffer to a different 353 // aspect before and after the buffer arriving, which probably isn't what we wanted. 354 // 355 // The first set of geometry functions are controlled by the scaling mode, described 356 // in window.h. The scaling mode may be set by the client, as it submits buffers. 357 // 358 // Put simply, if our scaling mode is SCALING_MODE_FREEZE, then 359 // matrix updates will not be applied while a resize is pending 360 // and the size and transform will remain in their previous state 361 // until a new buffer is submitted. If the scaling mode is another value 362 // then the old-buffer will immediately be scaled to the pending size 363 // and the new matrix will be immediately applied following this scaling 364 // transformation. 365 366 // Set the default buffer size for the assosciated Producer, in pixels. This is 367 // also the rendered size of the layer prior to any transformations. Parent 368 // or local matrix transformations will not affect the size of the buffer, 369 // but may affect it's on-screen size or clipping. 370 virtual bool setSize(uint32_t w, uint32_t h); 371 // Set a 2x2 transformation matrix on the layer. This transform 372 // will be applied after parent transforms, but before any final 373 // producer specified transform. 374 virtual bool setMatrix(const layer_state_t::matrix22_t& matrix, 375 bool allowNonRectPreservingTransforms); 376 377 // This second set of geometry attributes are controlled by 378 // setGeometryAppliesWithResize, and their default mode is to be 379 // immediate. If setGeometryAppliesWithResize is specified 380 // while a resize is pending, then update of these attributes will 381 // be delayed until the resize completes. 382 383 // setPosition operates in parent buffer space (pre parent-transform) or display 384 // space for top-level layers. 385 virtual bool setPosition(float x, float y); 386 // Buffer space 387 virtual bool setCrop(const Rect& crop); 388 389 // TODO(b/38182121): Could we eliminate the various latching modes by 390 // using the layer hierarchy? 391 // ----------------------------------------------------------------------- 392 virtual bool setLayer(int32_t z); 393 virtual bool setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ); 394 395 virtual bool setAlpha(float alpha); setColor(const half3 &)396 virtual bool setColor(const half3& /*color*/) { return false; }; 397 398 // Set rounded corner radius for this layer and its children. 399 // 400 // We only support 1 radius per layer in the hierarchy, where parent layers have precedence. 401 // The shape of the rounded corner rectangle is specified by the crop rectangle of the layer 402 // from which we inferred the rounded corner radius. 403 virtual bool setCornerRadius(float cornerRadius); 404 // When non-zero, everything below this layer will be blurred by backgroundBlurRadius, which 405 // is specified in pixels. 406 virtual bool setBackgroundBlurRadius(int backgroundBlurRadius); 407 virtual bool setBlurRegions(const std::vector<BlurRegion>& effectRegions); 408 virtual bool setTransparentRegionHint(const Region& transparent); 409 virtual bool setTrustedOverlay(bool); 410 virtual bool setFlags(uint32_t flags, uint32_t mask); 411 virtual bool setLayerStack(uint32_t layerStack); 412 virtual uint32_t getLayerStack() const; 413 virtual bool setMetadata(const LayerMetadata& data); 414 virtual void setChildrenDrawingParent(const sp<Layer>&); 415 virtual bool reparent(const sp<IBinder>& newParentHandle); 416 virtual bool setColorTransform(const mat4& matrix); 417 virtual mat4 getColorTransform() const; 418 virtual bool hasColorTransform() const; isColorSpaceAgnostic()419 virtual bool isColorSpaceAgnostic() const { return mDrawingState.colorSpaceAgnostic; } 420 421 // Used only to set BufferStateLayer state setTransform(uint32_t)422 virtual bool setTransform(uint32_t /*transform*/) { return false; }; setTransformToDisplayInverse(bool)423 virtual bool setTransformToDisplayInverse(bool /*transformToDisplayInverse*/) { return false; }; setBuffer(const std::shared_ptr<renderengine::ExternalTexture> &,const sp<Fence> &,nsecs_t,nsecs_t,bool,const client_cache_t &,uint64_t,std::optional<nsecs_t>,const FrameTimelineInfo &,const sp<ITransactionCompletedListener> &,const sp<IBinder> &)424 virtual bool setBuffer(const std::shared_ptr<renderengine::ExternalTexture>& /*buffer*/, 425 const sp<Fence>& /*acquireFence*/, nsecs_t /*postTime*/, 426 nsecs_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/, 427 const client_cache_t& /*clientCacheId*/, uint64_t /* frameNumber */, 428 std::optional<nsecs_t> /* dequeueTime */, 429 const FrameTimelineInfo& /*info*/, 430 const sp<ITransactionCompletedListener>& /* releaseBufferListener */, 431 const sp<IBinder>& /* releaseBufferEndpoint */) { 432 return false; 433 }; setAcquireFence(const sp<Fence> &)434 virtual bool setAcquireFence(const sp<Fence>& /*fence*/) { return false; }; setDataspace(ui::Dataspace)435 virtual bool setDataspace(ui::Dataspace /*dataspace*/) { return false; }; setHdrMetadata(const HdrMetadata &)436 virtual bool setHdrMetadata(const HdrMetadata& /*hdrMetadata*/) { return false; }; setSurfaceDamageRegion(const Region &)437 virtual bool setSurfaceDamageRegion(const Region& /*surfaceDamage*/) { return false; }; setApi(int32_t)438 virtual bool setApi(int32_t /*api*/) { return false; }; setSidebandStream(const sp<NativeHandle> &)439 virtual bool setSidebandStream(const sp<NativeHandle>& /*sidebandStream*/) { return false; }; setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>> &)440 virtual bool setTransactionCompletedListeners( 441 const std::vector<sp<CallbackHandle>>& /*handles*/) { 442 return false; 443 }; addFrameEvent(const sp<Fence> &,nsecs_t,nsecs_t)444 virtual bool addFrameEvent(const sp<Fence>& /*acquireFence*/, nsecs_t /*postedTime*/, 445 nsecs_t /*requestedPresentTime*/) { 446 return false; 447 } 448 virtual bool setBackgroundColor(const half3& color, float alpha, ui::Dataspace dataspace); 449 virtual bool setColorSpaceAgnostic(const bool agnostic); 450 virtual bool setFrameRateSelectionPriority(int32_t priority); 451 virtual bool setFixedTransformHint(ui::Transform::RotationFlags fixedTransformHint); setAutoRefresh(bool)452 virtual void setAutoRefresh(bool /* autoRefresh */) {} 453 bool setDropInputMode(gui::DropInputMode); 454 455 // If the variable is not set on the layer, it traverses up the tree to inherit the frame 456 // rate priority from its parent. 457 virtual int32_t getFrameRateSelectionPriority() const; getDataSpace()458 virtual ui::Dataspace getDataSpace() const { return ui::Dataspace::UNKNOWN; } 459 460 virtual sp<compositionengine::LayerFE> getCompositionEngineLayerFE() const; 461 virtual compositionengine::LayerFECompositionState* editCompositionState(); 462 463 // If we have received a new buffer this frame, we will pass its surface 464 // damage down to hardware composer. Otherwise, we must send a region with 465 // one empty rect. useSurfaceDamage()466 virtual void useSurfaceDamage() {} useEmptyDamage()467 virtual void useEmptyDamage() {} 468 Region getVisibleRegion(const DisplayDevice*) const; 469 470 /* 471 * isOpaque - true if this surface is opaque 472 * 473 * This takes into account the buffer format (i.e. whether or not the 474 * pixel format includes an alpha channel) and the "opaque" flag set 475 * on the layer. It does not examine the current plane alpha value. 476 */ isOpaque(const Layer::State &)477 virtual bool isOpaque(const Layer::State&) const { return false; } 478 479 /* 480 * Returns whether this layer can receive input. 481 */ 482 virtual bool canReceiveInput() const; 483 484 /* 485 * isProtected - true if the layer may contain protected contents in the 486 * GRALLOC_USAGE_PROTECTED sense. 487 */ isProtected()488 virtual bool isProtected() const { return false; } 489 490 /* 491 * isFixedSize - true if content has a fixed size 492 */ isFixedSize()493 virtual bool isFixedSize() const { return true; } 494 495 /* 496 * usesSourceCrop - true if content should use a source crop 497 */ usesSourceCrop()498 virtual bool usesSourceCrop() const { return false; } 499 500 // Most layers aren't created from the main thread, and therefore need to 501 // grab the SF state lock to access HWC, but ContainerLayer does, so we need 502 // to avoid grabbing the lock again to avoid deadlock isCreatedFromMainThread()503 virtual bool isCreatedFromMainThread() const { return false; } 504 getActiveWidth(const Layer::State & s)505 uint32_t getActiveWidth(const Layer::State& s) const { return s.width; } getActiveHeight(const Layer::State & s)506 uint32_t getActiveHeight(const Layer::State& s) const { return s.height; } getActiveTransform(const Layer::State & s)507 ui::Transform getActiveTransform(const Layer::State& s) const { return s.transform; } getActiveTransparentRegion(const Layer::State & s)508 virtual Region getActiveTransparentRegion(const Layer::State& s) const { 509 return s.activeTransparentRegion_legacy; 510 } getCrop(const Layer::State & s)511 virtual Rect getCrop(const Layer::State& s) const { return s.crop; } needsFiltering(const DisplayDevice *)512 virtual bool needsFiltering(const DisplayDevice*) const { return false; } 513 514 // True if this layer requires filtering 515 // This method is distinct from needsFiltering() in how the filter 516 // requirement is computed. needsFiltering() compares displayFrame and crop, 517 // where as this method transforms the displayFrame to layer-stack space 518 // first. This method should be used if there is no physical display to 519 // project onto when taking screenshots, as the filtering requirements are 520 // different. 521 // If the parent transform needs to be undone when capturing the layer, then 522 // the inverse parent transform is also required. needsFilteringForScreenshots(const DisplayDevice *,const ui::Transform &)523 virtual bool needsFilteringForScreenshots(const DisplayDevice*, const ui::Transform&) const { 524 return false; 525 } 526 updateCloneBufferInfo()527 virtual void updateCloneBufferInfo(){}; 528 setDefaultBufferSize(uint32_t,uint32_t)529 virtual void setDefaultBufferSize(uint32_t /*w*/, uint32_t /*h*/) {} 530 isHdrY410()531 virtual bool isHdrY410() const { return false; } 532 shouldPresentNow(nsecs_t)533 virtual bool shouldPresentNow(nsecs_t /*expectedPresentTime*/) const { return false; } 534 getHeadFrameNumber(nsecs_t)535 virtual uint64_t getHeadFrameNumber(nsecs_t /* expectedPresentTime */) const { return 0; } 536 537 /* 538 * called after composition. 539 * returns true if the layer latched a new buffer this frame. 540 */ onPostComposition(const DisplayDevice *,const std::shared_ptr<FenceTime> &,const std::shared_ptr<FenceTime> &,const CompositorTiming &)541 virtual bool onPostComposition(const DisplayDevice*, 542 const std::shared_ptr<FenceTime>& /*glDoneFence*/, 543 const std::shared_ptr<FenceTime>& /*presentFence*/, 544 const CompositorTiming&) { 545 return false; 546 } 547 548 // If a buffer was replaced this frame, release the former buffer releasePendingBuffer(nsecs_t)549 virtual void releasePendingBuffer(nsecs_t /*dequeueReadyTime*/) { } 550 finalizeFrameEventHistory(const std::shared_ptr<FenceTime> &,const CompositorTiming &)551 virtual void finalizeFrameEventHistory(const std::shared_ptr<FenceTime>& /*glDoneFence*/, 552 const CompositorTiming& /*compositorTiming*/) {} 553 554 /* 555 * latchBuffer - called each time the screen is redrawn and returns whether 556 * the visible regions need to be recomputed (this is a fairly heavy 557 * operation, so this should be set only if needed). Typically this is used 558 * to figure out if the content or size of a surface has changed. 559 */ latchBuffer(bool &,nsecs_t,nsecs_t)560 virtual bool latchBuffer(bool& /*recomputeVisibleRegions*/, nsecs_t /*latchTime*/, 561 nsecs_t /*expectedPresentTime*/) { 562 return false; 563 } 564 isBufferLatched()565 virtual bool isBufferLatched() const { return false; } 566 latchAndReleaseBuffer()567 virtual void latchAndReleaseBuffer() {} 568 569 /* 570 * returns the rectangle that crops the content of the layer and scales it 571 * to the layer's size. 572 */ getBufferCrop()573 virtual Rect getBufferCrop() const { return Rect(); } 574 575 /* 576 * Returns the transform applied to the buffer. 577 */ getBufferTransform()578 virtual uint32_t getBufferTransform() const { return 0; } 579 getBuffer()580 virtual sp<GraphicBuffer> getBuffer() const { return nullptr; } 581 getTransformHint()582 virtual ui::Transform::RotationFlags getTransformHint() const { return ui::Transform::ROT_0; } 583 584 /* 585 * Returns if a frame is ready 586 */ hasReadyFrame()587 virtual bool hasReadyFrame() const { return false; } 588 getQueuedFrameCount()589 virtual int32_t getQueuedFrameCount() const { return 0; } 590 591 /** 592 * Returns active buffer size in the correct orientation. Buffer size is determined by undoing 593 * any buffer transformations. If the layer has no buffer then return INVALID_RECT. 594 */ getBufferSize(const Layer::State &)595 virtual Rect getBufferSize(const Layer::State&) const { return Rect::INVALID_RECT; } 596 597 /** 598 * Returns the source bounds. If the bounds are not defined, it is inferred from the 599 * buffer size. Failing that, the bounds are determined from the passed in parent bounds. 600 * For the root layer, this is the display viewport size. 601 */ computeSourceBounds(const FloatRect & parentBounds)602 virtual FloatRect computeSourceBounds(const FloatRect& parentBounds) const { 603 return parentBounds; 604 } 605 virtual FrameRate getFrameRateForLayerTree() const; 606 getOccupancyHistory(bool)607 virtual std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool /*forceFlush*/) { 608 return {}; 609 } 610 getTransformToDisplayInverse()611 virtual bool getTransformToDisplayInverse() const { return false; } 612 613 // Returns how rounded corners should be drawn for this layer. 614 // A layer can override its parent's rounded corner settings if the parent's rounded 615 // corner crop does not intersect with its own rounded corner crop. 616 virtual RoundedCornerState getRoundedCornerState() const; 617 hasRoundedCorners()618 bool hasRoundedCorners() const override { return getRoundedCornerState().radius > .0f; } 619 getPixelFormat()620 virtual PixelFormat getPixelFormat() const { return PIXEL_FORMAT_NONE; } 621 /** 622 * Return whether this layer needs an input info. For most layer types 623 * this is only true if they explicitly set an input-info but BufferLayer 624 * overrides this so we can generate input-info for Buffered layers that don't 625 * have them (for input occlusion detection checks). 626 */ needsInputInfo()627 virtual bool needsInputInfo() const { return hasInputInfo(); } 628 629 // Implements RefBase. 630 void onFirstRef() override; 631 632 // implements compositionengine::LayerFE 633 const compositionengine::LayerFECompositionState* getCompositionState() const override; 634 bool onPreComposition(nsecs_t) override; 635 void prepareCompositionState(compositionengine::LayerFE::StateSubset subset) override; 636 std::vector<compositionengine::LayerFE::LayerSettings> prepareClientCompositionList( 637 compositionengine::LayerFE::ClientCompositionTargetSettings&) override; 638 void onLayerDisplayed(const sp<Fence>& releaseFence) override; 639 const char* getDebugName() const override; 640 641 bool setShadowRadius(float shadowRadius); 642 643 // Before color management is introduced, contents on Android have to be 644 // desaturated in order to match what they appears like visually. 645 // With color management, these contents will appear desaturated, thus 646 // needed to be saturated so that they match what they are designed for 647 // visually. 648 bool isLegacyDataSpace() const; 649 getTransactionFlags()650 uint32_t getTransactionFlags() const { return mTransactionFlags; } 651 uint32_t getTransactionFlags(uint32_t flags); 652 uint32_t setTransactionFlags(uint32_t flags); 653 654 // Deprecated, please use compositionengine::Output::belongsInOutput() 655 // instead. 656 // TODO(lpique): Move the remaining callers (screencap) to the new function. belongsToDisplay(uint32_t layerStack)657 bool belongsToDisplay(uint32_t layerStack) const { return getLayerStack() == layerStack; } 658 659 FloatRect getBounds(const Region& activeTransparentRegion) const; 660 FloatRect getBounds() const; 661 662 // Compute bounds for the layer and cache the results. 663 void computeBounds(FloatRect parentBounds, ui::Transform parentTransform, float shadowRadius); 664 getSequence()665 int32_t getSequence() const override { return sequence; } 666 667 // For tracing. 668 // TODO: Replace with raw buffer id from buffer metadata when that becomes available. 669 // GraphicBuffer::getId() does not provide a reliable global identifier. Since the traces 670 // creates its tracks by buffer id and has no way of associating a buffer back to the process 671 // that created it, the current implementation is only sufficient for cases where a buffer is 672 // only used within a single layer. getCurrentBufferId()673 uint64_t getCurrentBufferId() const { return getBuffer() ? getBuffer()->getId() : 0; } 674 675 /* 676 * isSecure - true if this surface is secure, that is if it prevents 677 * screenshots or VNC servers. A surface can be set to be secure by the 678 * application, being secure doesn't mean the surface has DRM contents. 679 */ 680 bool isSecure() const; 681 682 /* 683 * isHiddenByPolicy - true if this layer has been forced invisible. 684 * just because this is false, doesn't mean isVisible() is true. 685 * For example if this layer has no active buffer, it may not be hidden by 686 * policy, but it still can not be visible. 687 */ 688 bool isHiddenByPolicy() const; 689 690 bool isRemovedFromCurrentState() const; 691 692 LayerProto* writeToProto(LayersProto& layersProto, uint32_t traceFlags, const DisplayDevice*); 693 694 // Write states that are modified by the main thread. This includes drawing 695 // state as well as buffer data. This should be called in the main or tracing 696 // thread. 697 void writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags, const DisplayDevice*); 698 // Write drawing or current state. If writing current state, the caller should hold the 699 // external mStateLock. If writing drawing state, this function should be called on the 700 // main or tracing thread. 701 void writeToProtoCommonState(LayerProto* layerInfo, LayerVector::StateSet, 702 uint32_t traceFlags = SurfaceTracing::TRACE_ALL); 703 getWindowType()704 gui::WindowInfo::Type getWindowType() const { return mWindowType; } 705 706 bool getPrimaryDisplayOnly() const; 707 708 void updateMirrorInfo(); 709 710 /* 711 * doTransaction - process the transaction. This is a good place to figure 712 * out which attributes of the surface have changed. 713 */ 714 virtual uint32_t doTransaction(uint32_t transactionFlags); 715 716 /* 717 * Remove relative z for the layer if its relative parent is not part of the 718 * provided layer tree. 719 */ 720 void removeRelativeZ(const std::vector<Layer*>& layersInTree); 721 722 /* 723 * Remove from current state and mark for removal. 724 */ 725 void removeFromCurrentState(); 726 727 /* 728 * called with the state lock from a binder thread when the layer is 729 * removed from the current list to the pending removal list 730 */ 731 void onRemovedFromCurrentState(); 732 733 /* 734 * Called when the layer is added back to the current state list. 735 */ 736 void addToCurrentState(); 737 738 /* 739 * Sets display transform hint on BufferLayerConsumer. 740 */ 741 void updateTransformHint(ui::Transform::RotationFlags); 742 getDrawingState()743 inline const State& getDrawingState() const { return mDrawingState; } getDrawingState()744 inline State& getDrawingState() { return mDrawingState; } 745 746 LayerDebugInfo getLayerDebugInfo(const DisplayDevice*) const; 747 748 void miniDump(std::string& result, const DisplayDevice&) const; 749 void dumpFrameStats(std::string& result) const; 750 void dumpFrameEvents(std::string& result); 751 void dumpCallingUidPid(std::string& result) const; 752 void clearFrameStats(); 753 void logFrameStats(); 754 void getFrameStats(FrameStats* outStats) const; 755 void onDisconnect(); 756 void addAndGetFrameTimestamps(const NewFrameEventsEntry* newEntry, 757 FrameEventHistoryDelta* outDelta); 758 759 ui::Transform getTransform() const; 760 761 // Returns the Alpha of the Surface, accounting for the Alpha 762 // of parent Surfaces in the hierarchy (alpha's will be multiplied 763 // down the hierarchy). 764 half getAlpha() const; 765 half4 getColor() const; 766 int32_t getBackgroundBlurRadius() const; drawShadows()767 bool drawShadows() const { return mEffectiveShadowRadius > 0.f; }; 768 769 // Returns the transform hint set by Window Manager on the layer or one of its parents. 770 // This traverses the current state because the data is needed when creating 771 // the layer(off drawing thread) and the hint should be available before the producer 772 // is ready to acquire a buffer. 773 ui::Transform::RotationFlags getFixedTransformHint() const; 774 775 /** 776 * Traverse this layer and it's hierarchy of children directly. Unlike traverseInZOrder 777 * which will not emit children who have relativeZOrder to another layer, this method 778 * just directly emits all children. It also emits them in no particular order. 779 * So this method is not suitable for graphical operations, as it doesn't represent 780 * the scene state, but it's also more efficient than traverseInZOrder and so useful for 781 * book-keeping. 782 */ 783 void traverse(LayerVector::StateSet, const LayerVector::Visitor&); 784 void traverseInReverseZOrder(LayerVector::StateSet, const LayerVector::Visitor&); 785 void traverseInZOrder(LayerVector::StateSet, const LayerVector::Visitor&); 786 787 /** 788 * Traverse only children in z order, ignoring relative layers that are not children of the 789 * parent. 790 */ 791 void traverseChildrenInZOrder(LayerVector::StateSet, const LayerVector::Visitor&); 792 793 size_t getChildrenCount() const; 794 795 // ONLY CALL THIS FROM THE LAYER DTOR! 796 // See b/141111965. We need to add current children to offscreen layers in 797 // the layer dtor so as not to dangle layers. Since the layer has not 798 // committed its transaction when the layer is destroyed, we must add 799 // current children. This is safe in the dtor as we will no longer update 800 // the current state, but should not be called anywhere else! getCurrentChildren()801 LayerVector& getCurrentChildren() { return mCurrentChildren; } 802 803 void addChild(const sp<Layer>&); 804 // Returns index if removed, or negative value otherwise 805 // for symmetry with Vector::remove 806 ssize_t removeChild(const sp<Layer>& layer); getParent()807 sp<Layer> getParent() const { return mCurrentParent.promote(); } 808 809 // Should be called with the surfaceflinger statelock held isAtRoot()810 bool isAtRoot() const { return mIsAtRoot; } setIsAtRoot(bool isAtRoot)811 void setIsAtRoot(bool isAtRoot) { mIsAtRoot = isAtRoot; } 812 hasParent()813 bool hasParent() const { return getParent() != nullptr; } 814 Rect getScreenBounds(bool reduceTransparentRegion = true) const; 815 bool setChildLayer(const sp<Layer>& childLayer, int32_t z); 816 bool setChildRelativeLayer(const sp<Layer>& childLayer, 817 const sp<IBinder>& relativeToHandle, int32_t relativeZ); 818 819 // Copy the current list of children to the drawing state. Called by 820 // SurfaceFlinger to complete a transaction. 821 void commitChildList(); 822 int32_t getZ(LayerVector::StateSet) const; 823 824 /** 825 * Returns the cropped buffer size or the layer crop if the layer has no buffer. Return 826 * INVALID_RECT if the layer has no buffer and no crop. 827 * A layer with an invalid buffer size and no crop is considered to be boundless. The layer 828 * bounds are constrained by its parent bounds. 829 */ 830 Rect getCroppedBufferSize(const Layer::State& s) const; 831 832 bool setFrameRate(FrameRate); 833 setFrameTimelineInfoForBuffer(const FrameTimelineInfo &)834 virtual void setFrameTimelineInfoForBuffer(const FrameTimelineInfo& /*info*/) {} 835 void setFrameTimelineVsyncForBufferTransaction(const FrameTimelineInfo& info, nsecs_t postTime); 836 void setFrameTimelineVsyncForBufferlessTransaction(const FrameTimelineInfo& info, 837 nsecs_t postTime); 838 839 void addSurfaceFrameDroppedForBuffer( 840 std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame); 841 void addSurfaceFramePresentedForBuffer( 842 std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame, nsecs_t acquireFenceTime, 843 nsecs_t currentLatchTime); 844 845 std::shared_ptr<frametimeline::SurfaceFrame> createSurfaceFrameForTransaction( 846 const FrameTimelineInfo& info, nsecs_t postTime); 847 std::shared_ptr<frametimeline::SurfaceFrame> createSurfaceFrameForBuffer( 848 const FrameTimelineInfo& info, nsecs_t queueTime, std::string debugName); 849 850 // Creates a new handle each time, so we only expect 851 // this to be called once. 852 sp<IBinder> getHandle(); getName()853 const std::string& getName() const { return mName; } 854 bool getPremultipledAlpha() const; 855 void setInputInfo(const gui::WindowInfo& info); 856 857 gui::WindowInfo fillInputInfo(const sp<DisplayDevice>& display); 858 /** 859 * Returns whether this layer has an explicitly set input-info. 860 */ 861 bool hasInputInfo() const; 862 863 // Sets the parent's gameMode for this layer and all its children. Parent's gameMode is applied 864 // only to layers that do not have the GAME_MODE_METADATA set by WMShell. Any layer(along with 865 // its children) that has the metadata set will use the gameMode from the metadata. 866 void setGameModeForTree(int32_t parentGameMode); setGameMode(int32_t gameMode)867 void setGameMode(int32_t gameMode) { mGameMode = gameMode; }; getGameMode()868 int32_t getGameMode() const { return mGameMode; } 869 getOwnerUid()870 virtual uid_t getOwnerUid() const { return mOwnerUid; } 871 getOwnerPid()872 pid_t getOwnerPid() { return mOwnerPid; } 873 874 // This layer is not a clone, but it's the parent to the cloned hierarchy. The 875 // variable mClonedChild represents the top layer that will be cloned so this 876 // layer will be the parent of mClonedChild. 877 // The layers in the cloned hierarchy will match the lifetime of the real layers. That is 878 // if the real layer is destroyed, then the clone layer will also be destroyed. 879 sp<Layer> mClonedChild; 880 bool mHadClonedChild = false; 881 void setClonedChild(const sp<Layer>& mClonedChild); 882 883 mutable bool contentDirty{false}; 884 Region surfaceDamageRegion; 885 886 // Layer serial number. This gives layers an explicit ordering, so we 887 // have a stable sort order when their layer stack and Z-order are 888 // the same. 889 int32_t sequence{sSequence++}; 890 891 bool mPendingHWCDestroy{false}; 892 backpressureEnabled()893 bool backpressureEnabled() { return mDrawingState.flags & layer_state_t::eEnableBackpressure; } 894 895 bool setStretchEffect(const StretchEffect& effect); 896 StretchEffect getStretchEffect() const; 897 setBufferCrop(const Rect &)898 virtual bool setBufferCrop(const Rect& /* bufferCrop */) { return false; } setDestinationFrame(const Rect &)899 virtual bool setDestinationFrame(const Rect& /* destinationFrame */) { return false; } getPendingBufferCounter()900 virtual std::atomic<int32_t>* getPendingBufferCounter() { return nullptr; } getPendingBufferCounterName()901 virtual std::string getPendingBufferCounterName() { return ""; } updateGeometry()902 virtual bool updateGeometry() { return false; } 903 904 protected: 905 friend class impl::SurfaceInterceptor; 906 907 // For unit tests 908 friend class TestableSurfaceFlinger; 909 friend class FpsReporterTest; 910 friend class RefreshRateSelectionTest; 911 friend class SetFrameRateTest; 912 friend class TransactionFrameTracerTest; 913 friend class TransactionSurfaceFrameTest; 914 915 virtual void setInitialValuesForClone(const sp<Layer>& clonedFrom); 916 virtual std::optional<compositionengine::LayerFE::LayerSettings> prepareClientComposition( 917 compositionengine::LayerFE::ClientCompositionTargetSettings&); 918 virtual void preparePerFrameCompositionState(); 919 virtual void commitTransaction(State& stateToCommit); onSurfaceFrameCreated(const std::shared_ptr<frametimeline::SurfaceFrame> &)920 virtual void onSurfaceFrameCreated(const std::shared_ptr<frametimeline::SurfaceFrame>&) {} 921 922 // Returns mCurrentScaling mode (originating from the 923 // Client) or mOverrideScalingMode mode (originating from 924 // the Surface Controller) if set. getEffectiveScalingMode()925 virtual uint32_t getEffectiveScalingMode() const { return 0; } 926 927 sp<compositionengine::LayerFE> asLayerFE() const; getClonedFrom()928 sp<Layer> getClonedFrom() { return mClonedFrom != nullptr ? mClonedFrom.promote() : nullptr; } isClone()929 bool isClone() { return mClonedFrom != nullptr; } isClonedFromAlive()930 bool isClonedFromAlive() { return getClonedFrom() != nullptr; } 931 932 void cloneDrawingState(const Layer* from); 933 void updateClonedDrawingState(std::map<sp<Layer>, sp<Layer>>& clonedLayersMap); 934 void updateClonedChildren(const sp<Layer>& mirrorRoot, 935 std::map<sp<Layer>, sp<Layer>>& clonedLayersMap); 936 void updateClonedRelatives(const std::map<sp<Layer>, sp<Layer>>& clonedLayersMap); 937 void addChildToDrawing(const sp<Layer>&); 938 void updateClonedInputInfo(const std::map<sp<Layer>, sp<Layer>>& clonedLayersMap); 939 940 // Modifies the passed in layer settings to clear the contents. If the blackout flag is set, 941 // the settings clears the content with a solid black fill. 942 void prepareClearClientComposition(LayerFE::LayerSettings&, bool blackout) const; 943 void prepareShadowClientComposition(LayerFE::LayerSettings& caster, const Rect& layerStackRect); 944 945 void prepareBasicGeometryCompositionState(); 946 void prepareGeometryCompositionState(); 947 void prepareCursorCompositionState(); 948 949 uint32_t getEffectiveUsage(uint32_t usage) const; 950 951 /** 952 * Setup rounded corners coordinates of this layer, taking into account the layer bounds and 953 * crop coordinates, transforming them into layer space. 954 */ 955 void setupRoundedCornersCropCoordinates(Rect win, const FloatRect& roundedCornersCrop) const; 956 void setParent(const sp<Layer>&); 957 LayerVector makeTraversalList(LayerVector::StateSet, bool* outSkipRelativeZUsers); 958 void addZOrderRelative(const wp<Layer>& relative); 959 void removeZOrderRelative(const wp<Layer>& relative); 960 compositionengine::OutputLayer* findOutputLayerForDisplay(const DisplayDevice*) const; 961 bool usingRelativeZ(LayerVector::StateSet) const; 962 963 virtual ui::Transform getInputTransform() const; 964 virtual Rect getInputBounds() const; 965 966 // constant 967 sp<SurfaceFlinger> mFlinger; 968 969 bool mPremultipliedAlpha{true}; 970 const std::string mName; 971 const std::string mTransactionName{"TX - " + mName}; 972 973 // These are only accessed by the main thread or the tracing thread. 974 State mDrawingState; 975 976 uint32_t mTransactionFlags{0}; 977 // Updated in doTransaction, used to track the last sequence number we 978 // committed. Currently this is really only used for updating visible 979 // regions. 980 int32_t mLastCommittedTxSequence = -1; 981 982 // Timestamp history for UIAutomation. Thread safe. 983 FrameTracker mFrameTracker; 984 985 // Timestamp history for the consumer to query. 986 // Accessed by both consumer and producer on main and binder threads. 987 Mutex mFrameEventHistoryMutex; 988 ConsumerFrameEventHistory mFrameEventHistory; 989 FenceTimeline mAcquireTimeline; 990 FenceTimeline mReleaseTimeline; 991 992 // main thread 993 sp<NativeHandle> mSidebandStream; 994 // False if the buffer and its contents have been previously used for GPU 995 // composition, true otherwise. 996 bool mIsActiveBufferUpdatedForGpu = true; 997 998 // We encode unset as -1. 999 std::atomic<uint64_t> mCurrentFrameNumber{0}; 1000 // Whether filtering is needed b/c of the drawingstate 1001 bool mNeedsFiltering{false}; 1002 1003 std::atomic<bool> mRemovedFromDrawingState{false}; 1004 1005 // page-flip thread (currently main thread) 1006 bool mProtectedByApp{false}; // application requires protected path to external sink 1007 1008 // protected by mLock 1009 mutable Mutex mLock; 1010 1011 const wp<Client> mClientRef; 1012 1013 // This layer can be a cursor on some displays. 1014 bool mPotentialCursor{false}; 1015 1016 LayerVector mCurrentChildren{LayerVector::StateSet::Current}; 1017 LayerVector mDrawingChildren{LayerVector::StateSet::Drawing}; 1018 1019 wp<Layer> mCurrentParent; 1020 wp<Layer> mDrawingParent; 1021 1022 // Window types from WindowManager.LayoutParams 1023 const gui::WindowInfo::Type mWindowType; 1024 1025 // The owner of the layer. If created from a non system process, it will be the calling uid. 1026 // If created from a system process, the value can be passed in. 1027 uid_t mOwnerUid; 1028 1029 // The owner pid of the layer. If created from a non system process, it will be the calling pid. 1030 // If created from a system process, the value can be passed in. 1031 pid_t mOwnerPid; 1032 1033 // Keeps track of the time SF latched the last buffer from this layer. 1034 // Used in buffer stuffing analysis in FrameTimeline. 1035 nsecs_t mLastLatchTime = 0; 1036 1037 mutable bool mDrawingStateModified = false; 1038 1039 private: setTransformHint(ui::Transform::RotationFlags)1040 virtual void setTransformHint(ui::Transform::RotationFlags) {} 1041 1042 // Returns true if the layer can draw shadows on its border. canDrawShadows()1043 virtual bool canDrawShadows() const { return true; } 1044 1045 Hwc2::IComposerClient::Composition getCompositionType(const DisplayDevice&) const; 1046 1047 /** 1048 * Returns an unsorted vector of all layers that are part of this tree. 1049 * That includes the current layer and all its descendants. 1050 */ 1051 std::vector<Layer*> getLayersInTree(LayerVector::StateSet); 1052 /** 1053 * Traverses layers that are part of this tree in the correct z order. 1054 * layersInTree must be sorted before calling this method. 1055 */ 1056 void traverseChildrenInZOrderInner(const std::vector<Layer*>& layersInTree, 1057 LayerVector::StateSet, const LayerVector::Visitor&); 1058 LayerVector makeChildrenTraversalList(LayerVector::StateSet, 1059 const std::vector<Layer*>& layersInTree); 1060 1061 void updateTreeHasFrameRateVote(); 1062 bool propagateFrameRateForLayerTree(FrameRate parentFrameRate, bool* transactionNeeded); 1063 bool setFrameRateForLayerTree(FrameRate); 1064 void setZOrderRelativeOf(const wp<Layer>& relativeOf); 1065 bool isTrustedOverlay() const; 1066 gui::DropInputMode getDropInputMode() const; 1067 void handleDropInputMode(gui::WindowInfo& info) const; 1068 1069 // Find the root of the cloned hierarchy, this means the first non cloned parent. 1070 // This will return null if first non cloned parent is not found. 1071 sp<Layer> getClonedRoot(); 1072 1073 // Finds the top most layer in the hierarchy. This will find the root Layer where the parent is 1074 // null. 1075 sp<Layer> getRootLayer(); 1076 1077 // Fills in the touch occlusion mode of the first parent (including this layer) that 1078 // hasInputInfo() or no-op if no such parent is found. 1079 void fillTouchOcclusionMode(gui::WindowInfo& info); 1080 1081 // Fills in the frame and transform info for the gui::WindowInfo 1082 void fillInputFrameInfo(gui::WindowInfo& info, const ui::Transform& toNonRotatedDisplay); 1083 1084 // Cached properties computed from drawing state 1085 // Effective transform taking into account parent transforms and any parent scaling, which is 1086 // a transform from the current layer coordinate space to display(screen) coordinate space. 1087 ui::Transform mEffectiveTransform; 1088 1089 // Bounds of the layer before any transformation is applied and before it has been cropped 1090 // by its parents. 1091 FloatRect mSourceBounds; 1092 1093 // Bounds of the layer in layer space. This is the mSourceBounds cropped by its layer crop and 1094 // its parent bounds. 1095 FloatRect mBounds; 1096 1097 // Layer bounds in screen space. 1098 FloatRect mScreenBounds; 1099 1100 bool mGetHandleCalled = false; 1101 1102 // Tracks the process and user id of the caller when creating this layer 1103 // to help debugging. 1104 pid_t mCallingPid; 1105 uid_t mCallingUid; 1106 1107 // The current layer is a clone of mClonedFrom. This means that this layer will update it's 1108 // properties based on mClonedFrom. When mClonedFrom latches a new buffer for BufferLayers, 1109 // this layer will update it's buffer. When mClonedFrom updates it's drawing state, children, 1110 // and relatives, this layer will update as well. 1111 wp<Layer> mClonedFrom; 1112 1113 // The inherited shadow radius after taking into account the layer hierarchy. This is the 1114 // final shadow radius for this layer. If a shadow is specified for a layer, then effective 1115 // shadow radius is the set shadow radius, otherwise its the parent's shadow radius. 1116 float mEffectiveShadowRadius = 0.f; 1117 1118 // Game mode for the layer. Set by WindowManagerShell, game mode is used in 1119 // metrics(SurfaceFlingerStats). 1120 int32_t mGameMode = 0; 1121 1122 // A list of regions on this layer that should have blurs. 1123 const std::vector<BlurRegion> getBlurRegions() const; 1124 1125 bool mIsAtRoot = false; 1126 }; 1127 1128 std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate); 1129 1130 } // namespace android 1131