diff options
| -rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 34 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferLayer.h | 17 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferQueueLayer.h | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 77 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 68 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 27 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/CompositionTest.cpp | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h | 24 |
10 files changed, 108 insertions, 151 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 8ecdd95cca..f0b0200bc5 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -319,7 +319,7 @@ bool BufferLayer::onPreComposition(nsecs_t refreshStartTime) { return hasReadyFrame(); } -bool BufferLayer::onPostComposition(sp<const DisplayDevice> displayDevice, +bool BufferLayer::onPostComposition(const DisplayDevice* display, const std::shared_ptr<FenceTime>& glDoneFence, const std::shared_ptr<FenceTime>& presentFence, const CompositorTiming& compositorTiming) { @@ -342,7 +342,7 @@ bool BufferLayer::onPostComposition(sp<const DisplayDevice> displayDevice, const int32_t layerId = getSequence(); mFlinger->mTimeStats->setDesiredTime(layerId, mCurrentFrameNumber, desiredPresentTime); - const auto outputLayer = findOutputLayerForDisplay(displayDevice); + const auto outputLayer = findOutputLayerForDisplay(display); if (outputLayer && outputLayer->requiresClientComposition()) { nsecs_t clientCompositionTimestamp = outputLayer->getState().clientCompositionTimestamp; mFlinger->mFrameTracer->traceTimestamp(layerId, getCurrentBufferId(), mCurrentFrameNumber, @@ -359,13 +359,15 @@ bool BufferLayer::onPostComposition(sp<const DisplayDevice> displayDevice, mFrameTracker.setFrameReadyTime(desiredPresentTime); } - const auto displayId = displayDevice->getId(); if (presentFence->isValid()) { mFlinger->mTimeStats->setPresentFence(layerId, mCurrentFrameNumber, presentFence); mFlinger->mFrameTracer->traceFence(layerId, getCurrentBufferId(), mCurrentFrameNumber, presentFence, FrameTracer::FrameEvent::PRESENT_FENCE); mFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence)); - } else if (displayId && mFlinger->getHwComposer().isConnected(*displayId)) { + } else if (!display) { + // Do nothing. + } else if (const auto displayId = display->getId(); + displayId && mFlinger->getHwComposer().isConnected(*displayId)) { // The HWC doesn't support present fences, so use the refresh // timestamp instead. const nsecs_t actualPresentTime = mFlinger->getHwComposer().getRefreshTimestamp(*displayId); @@ -600,14 +602,8 @@ bool BufferLayer::getOpacityForFormat(uint32_t format) { return true; } -bool BufferLayer::needsFiltering(const sp<const DisplayDevice>& displayDevice) const { - // If we are not capturing based on the state of a known display device, - // just return false. - if (displayDevice == nullptr) { - return false; - } - - const auto outputLayer = findOutputLayerForDisplay(displayDevice); +bool BufferLayer::needsFiltering(const DisplayDevice* display) const { + const auto outputLayer = findOutputLayerForDisplay(display); if (outputLayer == nullptr) { return false; } @@ -621,15 +617,9 @@ bool BufferLayer::needsFiltering(const sp<const DisplayDevice>& displayDevice) c sourceCrop.getWidth() != displayFrame.getWidth(); } -bool BufferLayer::needsFilteringForScreenshots(const sp<const DisplayDevice>& displayDevice, +bool BufferLayer::needsFilteringForScreenshots(const DisplayDevice* display, const ui::Transform& inverseParentTransform) const { - // If we are not capturing based on the state of a known display device, - // just return false. - if (displayDevice == nullptr) { - return false; - } - - const auto outputLayer = findOutputLayerForDisplay(displayDevice); + const auto outputLayer = findOutputLayerForDisplay(display); if (outputLayer == nullptr) { return false; } @@ -637,7 +627,7 @@ bool BufferLayer::needsFilteringForScreenshots(const sp<const DisplayDevice>& di // We need filtering if the sourceCrop rectangle size does not match the // viewport rectangle size (not a 1:1 render) const auto& compositionState = outputLayer->getState(); - const ui::Transform& displayTransform = displayDevice->getTransform(); + const ui::Transform& displayTransform = display->getTransform(); const ui::Transform inverseTransform = inverseParentTransform * displayTransform.inverse(); // Undo the transformation of the displayFrame so that we're back into // layer-stack space. @@ -843,7 +833,7 @@ void BufferLayer::updateCloneBufferInfo() { mDrawingState.inputInfo = tmpInputInfo; } -void BufferLayer::setTransformHint(ui::Transform::RotationFlags displayTransformHint) const { +void BufferLayer::setTransformHint(ui::Transform::RotationFlags displayTransformHint) { mTransformHint = getFixedTransformHint(); if (mTransformHint == ui::Transform::ROT_INVALID) { mTransformHint = displayTransformHint; diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index cfccc8ab79..97ffe6f528 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -79,10 +79,9 @@ public: bool isHdrY410() const override; - bool onPostComposition(sp<const DisplayDevice> displayDevice, - const std::shared_ptr<FenceTime>& glDoneFence, + bool onPostComposition(const DisplayDevice*, const std::shared_ptr<FenceTime>& glDoneFence, const std::shared_ptr<FenceTime>& presentFence, - const CompositorTiming& compositorTiming) override; + const CompositorTiming&) override; // latchBuffer - called each time the screen is redrawn and returns whether // the visible regions need to be recomputed (this is a fairly heavy @@ -119,10 +118,6 @@ public: ui::Transform::RotationFlags getTransformHint() const override { return mTransformHint; } - void setTransformHint(ui::Transform::RotationFlags displayTransformHint) const override; - - // ----------------------------------------------------------------------- - // ----------------------------------------------------------------------- // Functions that must be implemented by derived classes // ----------------------------------------------------------------------- @@ -209,14 +204,16 @@ protected: virtual uint64_t getHeadFrameNumber(nsecs_t expectedPresentTime) const; + void setTransformHint(ui::Transform::RotationFlags displayTransformHint) override; + // Transform hint provided to the producer. This must be accessed holding /// the mStateLock. - mutable ui::Transform::RotationFlags mTransformHint = ui::Transform::ROT_0; + ui::Transform::RotationFlags mTransformHint = ui::Transform::ROT_0; private: // Returns true if this layer requires filtering - bool needsFiltering(const sp<const DisplayDevice>& displayDevice) const override; - bool needsFilteringForScreenshots(const sp<const DisplayDevice>& displayDevice, + bool needsFiltering(const DisplayDevice*) const override; + bool needsFilteringForScreenshots(const DisplayDevice*, const ui::Transform& inverseParentTransform) const override; // BufferStateLayers can return Rect::INVALID_RECT if the layer does not have a display frame diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 5d807681b2..e5b94e437f 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -58,7 +58,7 @@ void BufferQueueLayer::onLayerDisplayed(const sp<Fence>& releaseFence) { } } -void BufferQueueLayer::setTransformHint(ui::Transform::RotationFlags displayTransformHint) const { +void BufferQueueLayer::setTransformHint(ui::Transform::RotationFlags displayTransformHint) { BufferLayer::setTransformHint(displayTransformHint); mConsumer->setTransformHint(mTransformHint); } diff --git a/services/surfaceflinger/BufferQueueLayer.h b/services/surfaceflinger/BufferQueueLayer.h index 9bcb63aca2..5ebc22d2af 100644 --- a/services/surfaceflinger/BufferQueueLayer.h +++ b/services/surfaceflinger/BufferQueueLayer.h @@ -43,8 +43,6 @@ public: void onLayerDisplayed(const sp<Fence>& releaseFence) override; - void setTransformHint(ui::Transform::RotationFlags displayTransformHint) const override; - std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush) override; // If a buffer was replaced this frame, release the former buffer @@ -72,6 +70,7 @@ private: bool getSidebandStreamChanged() const override; bool latchSidebandStream(bool& recomputeVisibleRegions) override; + void setTransformHint(ui::Transform::RotationFlags displayTransformHint) override; bool hasFrameUpdate() const override; diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 8c8615363a..cb467ea292 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -93,6 +93,10 @@ public: static ui::Transform::RotationFlags getPrimaryDisplayRotationFlags(); + ui::Transform::RotationFlags getTransformHint() const { + return static_cast<ui::Transform::RotationFlags>(getTransform().getOrientation()); + } + const ui::Transform& getTransform() const; const Rect& getViewport() const; const Rect& getFrame() const; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 25929ed1d7..17458e3c9e 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -145,11 +145,10 @@ Layer::~Layer() { mFlinger->onLayerDestroyed(this); } -LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, const sp<Client> client, - std::string name, uint32_t w, uint32_t h, uint32_t flags, - LayerMetadata metadata) +LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, sp<Client> client, std::string name, + uint32_t w, uint32_t h, uint32_t flags, LayerMetadata metadata) : flinger(flinger), - client(client), + client(std::move(client)), name(std::move(name)), w(w), h(h), @@ -718,9 +717,8 @@ std::vector<compositionengine::LayerFE::LayerSettings> Layer::prepareClientCompo return {*shadowSettings}; } -Hwc2::IComposerClient::Composition Layer::getCompositionType( - const sp<const DisplayDevice>& display) const { - const auto outputLayer = findOutputLayerForDisplay(display); +Hwc2::IComposerClient::Composition Layer::getCompositionType(const DisplayDevice& display) const { + const auto outputLayer = findOutputLayerForDisplay(&display); if (outputLayer == nullptr) { return Hwc2::IComposerClient::Composition::INVALID; } @@ -731,12 +729,6 @@ Hwc2::IComposerClient::Composition Layer::getCompositionType( } } -bool Layer::getClearClientTarget(const sp<const DisplayDevice>& display) const { - const auto outputLayer = findOutputLayerForDisplay(display); - LOG_FATAL_IF(!outputLayer); - return outputLayer->getState().clearClientTarget; -} - bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { if (point->getFrameNumber() <= mCurrentFrameNumber) { // Don't bother with a SyncPoint, since we've already latched the @@ -1472,19 +1464,11 @@ uint32_t Layer::getEffectiveUsage(uint32_t usage) const { return usage; } -void Layer::updateTransformHint(const sp<const DisplayDevice>& display) const { - ui::Transform::RotationFlags transformHint = ui::Transform::ROT_0; - // Disable setting transform hint if the debug flag is set. - if (!mFlinger->mDebugDisableTransformHint) { - // The transform hint is used to improve performance, but we can - // only have a single transform hint, it cannot - // apply to all displays. - const ui::Transform& planeTransform = display->getTransform(); - transformHint = static_cast<ui::Transform::RotationFlags>(planeTransform.getOrientation()); - if (transformHint & ui::Transform::ROT_INVALID) { - transformHint = ui::Transform::ROT_0; - } +void Layer::updateTransformHint(ui::Transform::RotationFlags transformHint) { + if (mFlinger->mDebugDisableTransformHint || transformHint & ui::Transform::ROT_INVALID) { + transformHint = ui::Transform::ROT_0; } + setTransformHint(transformHint); } @@ -1493,7 +1477,7 @@ void Layer::updateTransformHint(const sp<const DisplayDevice>& display) const { // ---------------------------------------------------------------------------- // TODO(marissaw): add new layer state info to layer debugging -LayerDebugInfo Layer::getLayerDebugInfo() const { +LayerDebugInfo Layer::getLayerDebugInfo(const DisplayDevice* display) const { using namespace std::string_literals; LayerDebugInfo info; @@ -1504,7 +1488,7 @@ LayerDebugInfo Layer::getLayerDebugInfo() const { info.mType = getType(); info.mTransparentRegion = ds.activeTransparentRegion_legacy; - info.mVisibleRegion = debugGetVisibleRegionOnDefaultDisplay(); + info.mVisibleRegion = getVisibleRegion(display); info.mSurfaceDamageRegion = surfaceDamageRegion; info.mLayerStack = getLayerStack(); info.mX = ds.active_legacy.transform.tx(); @@ -1574,8 +1558,8 @@ std::string Layer::frameRateCompatibilityString(Layer::FrameRateCompatibility co } } -void Layer::miniDump(std::string& result, const sp<DisplayDevice>& displayDevice) const { - auto outputLayer = findOutputLayerForDisplay(displayDevice); +void Layer::miniDump(std::string& result, const DisplayDevice& display) const { + const auto outputLayer = findOutputLayerForDisplay(&display); if (!outputLayer) { return; } @@ -1602,7 +1586,7 @@ void Layer::miniDump(std::string& result, const sp<DisplayDevice>& displayDevice StringAppendF(&result, " %10d | ", layerState.z); } StringAppendF(&result, " %10d | ", mWindowType); - StringAppendF(&result, "%10s | ", toString(getCompositionType(displayDevice)).c_str()); + StringAppendF(&result, "%10s | ", toString(getCompositionType(display)).c_str()); StringAppendF(&result, "%10s | ", toString(outputLayerState.bufferTransform).c_str()); const Rect& frame = outputLayerState.displayFrame; StringAppendF(&result, "%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom); @@ -2175,27 +2159,28 @@ void Layer::setInputInfo(const InputWindowInfo& info) { } LayerProto* Layer::writeToProto(LayersProto& layersProto, uint32_t traceFlags, - const sp<const DisplayDevice>& device) const { + const DisplayDevice* display) const { LayerProto* layerProto = layersProto.add_layers(); - writeToProtoDrawingState(layerProto, traceFlags); + writeToProtoDrawingState(layerProto, traceFlags, display); writeToProtoCommonState(layerProto, LayerVector::StateSet::Drawing, traceFlags); if (traceFlags & SurfaceTracing::TRACE_COMPOSITION) { // Only populate for the primary display. - if (device) { - const Hwc2::IComposerClient::Composition compositionType = getCompositionType(device); + if (display) { + const Hwc2::IComposerClient::Composition compositionType = getCompositionType(*display); layerProto->set_hwc_composition_type(static_cast<HwcCompositionType>(compositionType)); } } for (const sp<Layer>& layer : mDrawingChildren) { - layer->writeToProto(layersProto, traceFlags, device); + layer->writeToProto(layersProto, traceFlags, display); } return layerProto; } -void Layer::writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags) const { +void Layer::writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags, + const DisplayDevice* display) const { ui::Transform transform = getTransform(); if (traceFlags & SurfaceTracing::TRACE_CRITICAL) { @@ -2229,7 +2214,7 @@ void Layer::writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags) [&]() { return layerInfo->mutable_position(); }); LayerProtoHelper::writeToProto(mBounds, [&]() { return layerInfo->mutable_bounds(); }); if (traceFlags & SurfaceTracing::TRACE_COMPOSITION) { - LayerProtoHelper::writeToProto(debugGetVisibleRegionOnDefaultDisplay(), + LayerProtoHelper::writeToProto(getVisibleRegion(display), [&]() { return layerInfo->mutable_visible_region(); }); } LayerProtoHelper::writeToProto(surfaceDamageRegion, @@ -2428,22 +2413,14 @@ bool Layer::canReceiveInput() const { } compositionengine::OutputLayer* Layer::findOutputLayerForDisplay( - const sp<const DisplayDevice>& display) const { + const DisplayDevice* display) const { + if (!display) return nullptr; return display->getCompositionDisplay()->getOutputLayerForLayer(getCompositionEngineLayerFE()); } -Region Layer::debugGetVisibleRegionOnDefaultDisplay() const { - sp<DisplayDevice> displayDevice = mFlinger->getDefaultDisplayDeviceLocked(); - if (displayDevice == nullptr) { - return {}; - } - - auto outputLayer = findOutputLayerForDisplay(displayDevice); - if (outputLayer == nullptr) { - return {}; - } - - return outputLayer->getState().visibleRegion; +Region Layer::getVisibleRegion(const DisplayDevice* display) const { + const auto outputLayer = findOutputLayerForDisplay(display); + return outputLayer ? outputLayer->getState().visibleRegion : Region(); } void Layer::setInitialValuesForClone(const sp<Layer>& clonedFrom) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 224ea19ffb..3fa935f314 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef ANDROID_LAYER_H -#define ANDROID_LAYER_H +#pragma once #include <compositionengine/LayerFE.h> #include <gui/BufferQueue.h> @@ -77,8 +76,8 @@ class SurfaceInterceptor; // --------------------------------------------------------------------------- struct LayerCreationArgs { - LayerCreationArgs(SurfaceFlinger* flinger, const sp<Client> client, std::string name, - uint32_t w, uint32_t h, uint32_t flags, LayerMetadata metadata); + LayerCreationArgs(SurfaceFlinger*, sp<Client>, std::string name, uint32_t w, uint32_t h, + uint32_t flags, LayerMetadata); SurfaceFlinger* flinger; const sp<Client> client; @@ -87,9 +86,9 @@ struct LayerCreationArgs { uint32_t h; uint32_t flags; LayerMetadata metadata; + pid_t callingPid; uid_t callingUid; - sp<const DisplayDevice> displayDevice; uint32_t textureName; }; @@ -519,15 +518,14 @@ public: bool isRemovedFromCurrentState() const; - LayerProto* writeToProto(LayersProto& layersProto, - uint32_t traceFlags = SurfaceTracing::TRACE_ALL, - const sp<const DisplayDevice>& device = nullptr) const; + LayerProto* writeToProto(LayersProto& layersProto, uint32_t traceFlags, + const DisplayDevice*) const; // Write states that are modified by the main thread. This includes drawing // state as well as buffer data. This should be called in the main or tracing // thread. - void writeToProtoDrawingState(LayerProto* layerInfo, - uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const; + void writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags, + const DisplayDevice*) const; // Write drawing or current state. If writing current state, the caller should hold the // external mStateLock. If writing drawing state, this function should be called on the // main or tracing thread. @@ -544,7 +542,7 @@ public: return s.activeTransparentRegion_legacy; } virtual Rect getCrop(const Layer::State& s) const { return s.crop_legacy; } - virtual bool needsFiltering(const sp<const DisplayDevice>&) const { return false; } + virtual bool needsFiltering(const DisplayDevice*) const { return false; } // True if this layer requires filtering // This method is distinct from needsFiltering() in how the filter // requirement is computed. needsFiltering() compares displayFrame and crop, @@ -554,8 +552,7 @@ public: // different. // If the parent transform needs to be undone when capturing the layer, then // the inverse parent transform is also required. - virtual bool needsFilteringForScreenshots(const sp<const DisplayDevice>&, - const ui::Transform&) const { + virtual bool needsFilteringForScreenshots(const DisplayDevice*, const ui::Transform&) const { return false; } @@ -616,21 +613,16 @@ public: virtual bool isHdrY410() const { return false; } - Hwc2::IComposerClient::Composition getCompositionType( - const sp<const DisplayDevice>& display) const; - bool getClearClientTarget(const sp<const DisplayDevice>& display) const; - virtual bool shouldPresentNow(nsecs_t /*expectedPresentTime*/) const { return false; } - virtual void setTransformHint(ui::Transform::RotationFlags /*transformHint*/) const {} /* * called after composition. * returns true if the layer latched a new buffer this frame. */ - virtual bool onPostComposition(sp<const DisplayDevice> /*displayDevice*/, + virtual bool onPostComposition(const DisplayDevice*, const std::shared_ptr<FenceTime>& /*glDoneFence*/, const std::shared_ptr<FenceTime>& /*presentFence*/, - const CompositorTiming& /*compositorTiming*/) { + const CompositorTiming&) { return false; } @@ -682,9 +674,10 @@ public: */ void addToCurrentState(); - // Updates the transform hint in our SurfaceFlingerConsumer to match - // the current orientation of the display device. - void updateTransformHint(const sp<const DisplayDevice>& display) const; + /* + * Sets display transform hint on BufferLayerConsumer. + */ + void updateTransformHint(ui::Transform::RotationFlags); /* * returns the rectangle that crops the content of the layer and scales it @@ -713,11 +706,10 @@ public: inline const State& getCurrentState() const { return mCurrentState; } inline State& getCurrentState() { return mCurrentState; } - LayerDebugInfo getLayerDebugInfo() const; + LayerDebugInfo getLayerDebugInfo(const DisplayDevice*) const; - /* always call base class first */ static void miniDumpHeader(std::string& result); - void miniDump(std::string& result, const sp<DisplayDevice>& display) const; + void miniDump(std::string& result, const DisplayDevice&) const; void dumpFrameStats(std::string& result) const; void dumpFrameEvents(std::string& result); void dumpCallingUidPid(std::string& result) const; @@ -822,11 +814,6 @@ public: return parentBounds; } - compositionengine::OutputLayer* findOutputLayerForDisplay( - const sp<const DisplayDevice>& display) const; - - Region debugGetVisibleRegionOnDefaultDisplay() const; - /** * Returns the cropped buffer size or the layer crop if the layer has no buffer. Return * INVALID_RECT if the layer has no buffer and no crop. @@ -963,7 +950,8 @@ public: bool hasInput() const; protected: - // ----------------------------------------------------------------------- + compositionengine::OutputLayer* findOutputLayerForDisplay(const DisplayDevice*) const; + bool usingRelativeZ(LayerVector::StateSet stateSet) const; bool mPremultipliedAlpha{true}; @@ -1035,6 +1023,11 @@ protected: const int mWindowType; private: + virtual void setTransformHint(ui::Transform::RotationFlags) {} + + Hwc2::IComposerClient::Composition getCompositionType(const DisplayDevice&) const; + Region getVisibleRegion(const DisplayDevice*) const; + /** * Returns an unsorted vector of all layers that are part of this tree. * That includes the current layer and all its descendants. @@ -1098,14 +1091,3 @@ private: }; } // namespace android - -#define RETURN_IF_NO_HWC_LAYER(displayDevice, ...) \ - do { \ - if (!hasHwcLayer(displayDevice)) { \ - ALOGE("[%s] %s failed: no HWC layer found for display %s", mName.string(), \ - __FUNCTION__, displayDevice->getDebugName().c_str()); \ - return __VA_ARGS__; \ - } \ - } while (false) - -#endif // ANDROID_LAYER_H diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 3b66fa9cd1..4cd1c9bd9b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1422,10 +1422,10 @@ status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayer return TIMED_OUT; } + const auto display = getDefaultDisplayDeviceLocked(); outLayers->clear(); - mCurrentState.traverseInZOrder([&](Layer* layer) { - outLayers->push_back(layer->getLayerDebugInfo()); - }); + mCurrentState.traverseInZOrder( + [&](Layer* layer) { outLayers->push_back(layer->getLayerDebugInfo(display.get())); }); mStateLock.unlock(); return NO_ERROR; @@ -2232,8 +2232,9 @@ void SurfaceFlinger::postComposition() } mDrawingState.traverse([&](Layer* layer) { - bool frameLatched = layer->onPostComposition(displayDevice, glCompositionDoneFenceTime, - presentFenceTime, compositorTiming); + const bool frameLatched = + layer->onPostComposition(displayDevice.get(), glCompositionDoneFenceTime, + presentFenceTime, compositorTiming); if (frameLatched) { recordBufferingStats(layer->getName(), layer->getOccupancyHistory(false)); } @@ -2826,7 +2827,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // could be null if there is no display available at all to get // the transform hint from. if (hintDisplay) { - layer->updateTransformHint(hintDisplay); + layer->updateTransformHint(hintDisplay->getTransformHint()); } first = false; @@ -3181,7 +3182,7 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBind } if (const auto display = getDefaultDisplayDeviceLocked()) { - lbc->updateTransformHint(display); + lbc->updateTransformHint(display->getTransformHint()); } if (outTransformHint) { *outTransformHint = lbc->getTransformHint(); @@ -4040,7 +4041,6 @@ status_t SurfaceFlinger::createBufferStateLayer(const sp<Client>& client, std::s LayerMetadata metadata, sp<IBinder>* handle, sp<Layer>* outLayer) { LayerCreationArgs args(this, client, std::move(name), w, h, flags, std::move(metadata)); - args.displayDevice = getDefaultDisplayDevice(); args.textureName = getNewTexture(); sp<BufferStateLayer> layer = getFactory().createBufferStateLayer(args); *handle = layer->getHandle(); @@ -4572,7 +4572,7 @@ LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t traceFlags) const { LayersProto layersProto; for (const sp<Layer>& layer : mDrawingState.layersSortedByZ) { - layer->writeToProto(layersProto, traceFlags, display); + layer->writeToProto(layersProto, traceFlags, display.get()); } return layersProto; @@ -4761,9 +4761,9 @@ void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, std::string& result) co StringAppendF(&result, "Display %s HWC layers:\n", to_string(*displayId).c_str()); Layer::miniDumpHeader(result); - const sp<DisplayDevice> displayDevice = display; - mCurrentState.traverseInZOrder( - [&](Layer* layer) { layer->miniDump(result, displayDevice); }); + + const DisplayDevice& ref = *display; + mCurrentState.traverseInZOrder([&](Layer* layer) { layer->miniDump(result, ref); }); result.append("\n"); } @@ -5752,6 +5752,7 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, fillLayer.alpha = half(alpha); clientCompositionLayers.push_back(fillLayer); + const auto display = renderArea.getDisplayDevice(); std::vector<Layer*> renderedLayers; Region clearRegion = Region::INVALID_REGION; traverseLayers([&](Layer* layer) { @@ -5760,7 +5761,7 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, compositionengine::LayerFE::ClientCompositionTargetSettings targetSettings{ clip, useIdentityTransform, - layer->needsFilteringForScreenshots(renderArea.getDisplayDevice(), transform) || + layer->needsFilteringForScreenshots(display.get(), transform) || renderArea.needsFiltering(), renderArea.isSecure(), supportProtectedContent, diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp index 8713b2bd49..32d722e9c9 100644 --- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp +++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp @@ -1073,7 +1073,8 @@ struct RECompositionResultVariant : public CompositionResultBaseVariant { struct ForcedClientCompositionResultVariant : public CompositionResultBaseVariant { static void setupLayerState(CompositionTest* test, sp<Layer> layer) { - const auto outputLayer = layer->findOutputLayerForDisplay(test->mDisplay); + const auto outputLayer = + TestableSurfaceFlinger::findOutputLayerForDisplay(layer, test->mDisplay); LOG_FATAL_IF(!outputLayer); outputLayer->editState().forceClientComposition = true; } diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index add33270f9..1c067cbae9 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -177,6 +177,8 @@ public: class TestableSurfaceFlinger { public: + using HotplugEvent = SurfaceFlinger::HotplugEvent; + SurfaceFlinger* flinger() { return mFlinger.get(); } TestableScheduler* scheduler() { return mScheduler; } @@ -246,28 +248,32 @@ public: memcpy(&mFlinger->mInternalDisplayPrimaries, &primaries, sizeof(ui::DisplayPrimaries)); } - using HotplugEvent = SurfaceFlinger::HotplugEvent; - - auto& mutableLayerCurrentState(sp<Layer> layer) { return layer->mCurrentState; } - auto& mutableLayerDrawingState(sp<Layer> layer) { return layer->mDrawingState; } + static auto& mutableLayerCurrentState(const sp<Layer>& layer) { return layer->mCurrentState; } + static auto& mutableLayerDrawingState(const sp<Layer>& layer) { return layer->mDrawingState; } auto& mutableStateLock() { return mFlinger->mStateLock; } - void setLayerSidebandStream(sp<Layer> layer, sp<NativeHandle> sidebandStream) { + static auto findOutputLayerForDisplay(const sp<Layer>& layer, + const sp<const DisplayDevice>& display) { + return layer->findOutputLayerForDisplay(display.get()); + } + + static void setLayerSidebandStream(const sp<Layer>& layer, + const sp<NativeHandle>& sidebandStream) { layer->mDrawingState.sidebandStream = sidebandStream; layer->mSidebandStream = sidebandStream; layer->editCompositionState()->sidebandStream = sidebandStream; } - void setLayerCompositionType(sp<Layer> layer, hal::Composition type) { - auto outputLayer = layer->findOutputLayerForDisplay(mFlinger->getDefaultDisplayDevice()); + void setLayerCompositionType(const sp<Layer>& layer, hal::Composition type) { + auto outputLayer = findOutputLayerForDisplay(layer, mFlinger->getDefaultDisplayDevice()); LOG_ALWAYS_FATAL_IF(!outputLayer); auto& state = outputLayer->editState(); LOG_ALWAYS_FATAL_IF(!outputLayer->getState().hwc); (*state.hwc).hwcCompositionType = type; - }; + } - void setLayerPotentialCursor(sp<Layer> layer, bool potentialCursor) { + static void setLayerPotentialCursor(const sp<Layer>& layer, bool potentialCursor) { layer->mPotentialCursor = potentialCursor; } |