Loading services/inputflinger/dispatcher/InputDispatcher.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -3640,7 +3640,8 @@ void InputDispatcher::updateWindowHandlesForDisplayLocked( continue; continue; } } if (oldHandlesById.find(handle->getId()) != oldHandlesById.end()) { if ((oldHandlesById.find(handle->getId()) != oldHandlesById.end()) && (oldHandlesById.at(handle->getId())->getToken() == handle->getToken())) { const sp<InputWindowHandle>& oldHandle = oldHandlesById.at(handle->getId()); const sp<InputWindowHandle>& oldHandle = oldHandlesById.at(handle->getId()); oldHandle->updateFrom(handle); oldHandle->updateFrom(handle); newHandles.push_back(oldHandle); newHandles.push_back(oldHandle); Loading services/surfaceflinger/BufferLayer.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -148,6 +148,11 @@ private: virtual status_t updateActiveBuffer() = 0; virtual status_t updateActiveBuffer() = 0; virtual status_t updateFrameNumber(nsecs_t latchTime) = 0; virtual status_t updateFrameNumber(nsecs_t latchTime) = 0; // We generate InputWindowHandles for all buffered layers regardless of whether they // have an InputChannel. This is to enable the InputDispatcher to do PID based occlusion // detection. bool needsInputInfo() const override { return true; } protected: protected: struct BufferInfo { struct BufferInfo { nsecs_t mDesiredPresentTime; nsecs_t mDesiredPresentTime; Loading services/surfaceflinger/BufferStateLayer.cpp +1 −15 Original line number Original line Diff line number Diff line Loading @@ -33,7 +33,6 @@ #include <renderengine/Image.h> #include <renderengine/Image.h> #include "EffectLayer.h" #include "EffectLayer.h" #include "FrameTracer/FrameTracer.h" #include "TimeStats/TimeStats.h" #include "TimeStats/TimeStats.h" namespace android { namespace android { Loading Loading @@ -98,9 +97,6 @@ void BufferStateLayer::onLayerDisplayed(const sp<Fence>& releaseFence) { // Prevent tracing the same release multiple times. // Prevent tracing the same release multiple times. if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) { if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) { mFlinger->mFrameTracer->traceFence(getSequence(), mPreviousBufferId, mPreviousFrameNumber, std::make_shared<FenceTime>(releaseFence), FrameTracer::FrameEvent::RELEASE_FENCE); mPreviousReleasedFrameNumber = mPreviousFrameNumber; mPreviousReleasedFrameNumber = mPreviousFrameNumber; } } } } Loading Loading @@ -277,9 +273,6 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence const int32_t layerId = getSequence(); const int32_t layerId = getSequence(); mFlinger->mTimeStats->setPostTime(layerId, mCurrentState.frameNumber, getName().c_str(), mFlinger->mTimeStats->setPostTime(layerId, mCurrentState.frameNumber, getName().c_str(), postTime); postTime); mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str()); mFlinger->mFrameTracer->traceTimestamp(layerId, buffer->getId(), mCurrentState.frameNumber, postTime, FrameTracer::FrameEvent::POST); desiredPresentTime = desiredPresentTime <= 0 ? 0 : desiredPresentTime; desiredPresentTime = desiredPresentTime <= 0 ? 0 : desiredPresentTime; mCurrentState.desiredPresentTime = desiredPresentTime; mCurrentState.desiredPresentTime = desiredPresentTime; Loading Loading @@ -580,20 +573,13 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse status_t err = bindTextureImage(); status_t err = bindTextureImage(); if (err != NO_ERROR) { if (err != NO_ERROR) { mFlinger->mTimeStats->onDestroy(layerId); mFlinger->mTimeStats->onDestroy(layerId); mFlinger->mFrameTracer->onDestroy(layerId); return BAD_VALUE; return BAD_VALUE; } } } } const uint64_t bufferID = getCurrentBufferId(); mFlinger->mTimeStats->setAcquireFence(layerId, mDrawingState.frameNumber, mFlinger->mTimeStats->setAcquireFence(layerId, mDrawingState.frameNumber, mBufferInfo.mFenceTime); std::make_shared<FenceTime>(mDrawingState.acquireFence)); mFlinger->mFrameTracer->traceFence(layerId, bufferID, mDrawingState.frameNumber, mBufferInfo.mFenceTime, FrameTracer::FrameEvent::ACQUIRE_FENCE); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); mFlinger->mFrameTracer->traceTimestamp(layerId, bufferID, mDrawingState.frameNumber, latchTime, FrameTracer::FrameEvent::LATCH); mCurrentStateModified = false; mCurrentStateModified = false; Loading services/surfaceflinger/DisplayHardware/HWC2.cpp +10 −6 Original line number Original line Diff line number Diff line Loading @@ -208,13 +208,17 @@ Error Display::getDisplayVsyncPeriod(nsecs_t* outVsyncPeriod) const { *outVsyncPeriod = static_cast<nsecs_t>(vsyncPeriodNanos); *outVsyncPeriod = static_cast<nsecs_t>(vsyncPeriodNanos); } else { } else { // Get the default vsync period // Get the default vsync period HWConfigId configId = 0; std::shared_ptr<const Display::Config> config; auto intError_2_1 = mComposer.getActiveConfig(mId, &configId); error = getActiveConfig(&config); error = static_cast<Error>(intError_2_1); if (error != Error::NONE) { if (error == Error::NONE) { return error; auto config = mConfigs.at(configId); *outVsyncPeriod = config->getVsyncPeriod(); } } if (!config) { // HWC has updated the display modes and hasn't notified us yet. return Error::BAD_CONFIG; } *outVsyncPeriod = config->getVsyncPeriod(); } } return error; return error; Loading services/surfaceflinger/Layer.cpp +24 −4 Original line number Original line Diff line number Diff line Loading @@ -229,13 +229,23 @@ void Layer::removeFromCurrentState() { mFlinger->markLayerPendingRemovalLocked(this); mFlinger->markLayerPendingRemovalLocked(this); } } sp<Layer> Layer::getRootLayer() { sp<Layer> parent = getParent(); if (parent == nullptr) { return this; } return parent->getRootLayer(); } void Layer::onRemovedFromCurrentState() { void Layer::onRemovedFromCurrentState() { auto layersInTree = getLayersInTree(LayerVector::StateSet::Current); // Use the root layer since we want to maintain the hierarchy for the entire subtree. auto layersInTree = getRootLayer()->getLayersInTree(LayerVector::StateSet::Current); std::sort(layersInTree.begin(), layersInTree.end()); std::sort(layersInTree.begin(), layersInTree.end()); for (const auto& layer : layersInTree) { traverse(LayerVector::StateSet::Current, [&](Layer* layer) { layer->removeFromCurrentState(); layer->removeFromCurrentState(); layer->removeRelativeZ(layersInTree); layer->removeRelativeZ(layersInTree); } }); } } void Layer::addToCurrentState() { void Layer::addToCurrentState() { Loading Loading @@ -2343,6 +2353,16 @@ bool Layer::isRemovedFromCurrentState() const { } } InputWindowInfo Layer::fillInputInfo() { InputWindowInfo Layer::fillInputInfo() { if (!hasInputInfo()) { mDrawingState.inputInfo.name = getName(); mDrawingState.inputInfo.ownerUid = mCallingUid; mDrawingState.inputInfo.ownerPid = mCallingPid; mDrawingState.inputInfo.inputFeatures = InputWindowInfo::INPUT_FEATURE_NO_INPUT_CHANNEL; mDrawingState.inputInfo.layoutParamsFlags = InputWindowInfo::FLAG_NOT_TOUCH_MODAL; mDrawingState.inputInfo.displayId = getLayerStack(); } InputWindowInfo info = mDrawingState.inputInfo; InputWindowInfo info = mDrawingState.inputInfo; info.id = sequence; info.id = sequence; Loading Loading @@ -2424,7 +2444,7 @@ sp<Layer> Layer::getClonedRoot() { return mDrawingParent.promote()->getClonedRoot(); return mDrawingParent.promote()->getClonedRoot(); } } bool Layer::hasInput() const { bool Layer::hasInputInfo() const { return mDrawingState.inputInfo.token != nullptr; return mDrawingState.inputInfo.token != nullptr; } } Loading Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -3640,7 +3640,8 @@ void InputDispatcher::updateWindowHandlesForDisplayLocked( continue; continue; } } if (oldHandlesById.find(handle->getId()) != oldHandlesById.end()) { if ((oldHandlesById.find(handle->getId()) != oldHandlesById.end()) && (oldHandlesById.at(handle->getId())->getToken() == handle->getToken())) { const sp<InputWindowHandle>& oldHandle = oldHandlesById.at(handle->getId()); const sp<InputWindowHandle>& oldHandle = oldHandlesById.at(handle->getId()); oldHandle->updateFrom(handle); oldHandle->updateFrom(handle); newHandles.push_back(oldHandle); newHandles.push_back(oldHandle); Loading
services/surfaceflinger/BufferLayer.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -148,6 +148,11 @@ private: virtual status_t updateActiveBuffer() = 0; virtual status_t updateActiveBuffer() = 0; virtual status_t updateFrameNumber(nsecs_t latchTime) = 0; virtual status_t updateFrameNumber(nsecs_t latchTime) = 0; // We generate InputWindowHandles for all buffered layers regardless of whether they // have an InputChannel. This is to enable the InputDispatcher to do PID based occlusion // detection. bool needsInputInfo() const override { return true; } protected: protected: struct BufferInfo { struct BufferInfo { nsecs_t mDesiredPresentTime; nsecs_t mDesiredPresentTime; Loading
services/surfaceflinger/BufferStateLayer.cpp +1 −15 Original line number Original line Diff line number Diff line Loading @@ -33,7 +33,6 @@ #include <renderengine/Image.h> #include <renderengine/Image.h> #include "EffectLayer.h" #include "EffectLayer.h" #include "FrameTracer/FrameTracer.h" #include "TimeStats/TimeStats.h" #include "TimeStats/TimeStats.h" namespace android { namespace android { Loading Loading @@ -98,9 +97,6 @@ void BufferStateLayer::onLayerDisplayed(const sp<Fence>& releaseFence) { // Prevent tracing the same release multiple times. // Prevent tracing the same release multiple times. if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) { if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) { mFlinger->mFrameTracer->traceFence(getSequence(), mPreviousBufferId, mPreviousFrameNumber, std::make_shared<FenceTime>(releaseFence), FrameTracer::FrameEvent::RELEASE_FENCE); mPreviousReleasedFrameNumber = mPreviousFrameNumber; mPreviousReleasedFrameNumber = mPreviousFrameNumber; } } } } Loading Loading @@ -277,9 +273,6 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence const int32_t layerId = getSequence(); const int32_t layerId = getSequence(); mFlinger->mTimeStats->setPostTime(layerId, mCurrentState.frameNumber, getName().c_str(), mFlinger->mTimeStats->setPostTime(layerId, mCurrentState.frameNumber, getName().c_str(), postTime); postTime); mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str()); mFlinger->mFrameTracer->traceTimestamp(layerId, buffer->getId(), mCurrentState.frameNumber, postTime, FrameTracer::FrameEvent::POST); desiredPresentTime = desiredPresentTime <= 0 ? 0 : desiredPresentTime; desiredPresentTime = desiredPresentTime <= 0 ? 0 : desiredPresentTime; mCurrentState.desiredPresentTime = desiredPresentTime; mCurrentState.desiredPresentTime = desiredPresentTime; Loading Loading @@ -580,20 +573,13 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse status_t err = bindTextureImage(); status_t err = bindTextureImage(); if (err != NO_ERROR) { if (err != NO_ERROR) { mFlinger->mTimeStats->onDestroy(layerId); mFlinger->mTimeStats->onDestroy(layerId); mFlinger->mFrameTracer->onDestroy(layerId); return BAD_VALUE; return BAD_VALUE; } } } } const uint64_t bufferID = getCurrentBufferId(); mFlinger->mTimeStats->setAcquireFence(layerId, mDrawingState.frameNumber, mFlinger->mTimeStats->setAcquireFence(layerId, mDrawingState.frameNumber, mBufferInfo.mFenceTime); std::make_shared<FenceTime>(mDrawingState.acquireFence)); mFlinger->mFrameTracer->traceFence(layerId, bufferID, mDrawingState.frameNumber, mBufferInfo.mFenceTime, FrameTracer::FrameEvent::ACQUIRE_FENCE); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); mFlinger->mTimeStats->setLatchTime(layerId, mDrawingState.frameNumber, latchTime); mFlinger->mFrameTracer->traceTimestamp(layerId, bufferID, mDrawingState.frameNumber, latchTime, FrameTracer::FrameEvent::LATCH); mCurrentStateModified = false; mCurrentStateModified = false; Loading
services/surfaceflinger/DisplayHardware/HWC2.cpp +10 −6 Original line number Original line Diff line number Diff line Loading @@ -208,13 +208,17 @@ Error Display::getDisplayVsyncPeriod(nsecs_t* outVsyncPeriod) const { *outVsyncPeriod = static_cast<nsecs_t>(vsyncPeriodNanos); *outVsyncPeriod = static_cast<nsecs_t>(vsyncPeriodNanos); } else { } else { // Get the default vsync period // Get the default vsync period HWConfigId configId = 0; std::shared_ptr<const Display::Config> config; auto intError_2_1 = mComposer.getActiveConfig(mId, &configId); error = getActiveConfig(&config); error = static_cast<Error>(intError_2_1); if (error != Error::NONE) { if (error == Error::NONE) { return error; auto config = mConfigs.at(configId); *outVsyncPeriod = config->getVsyncPeriod(); } } if (!config) { // HWC has updated the display modes and hasn't notified us yet. return Error::BAD_CONFIG; } *outVsyncPeriod = config->getVsyncPeriod(); } } return error; return error; Loading
services/surfaceflinger/Layer.cpp +24 −4 Original line number Original line Diff line number Diff line Loading @@ -229,13 +229,23 @@ void Layer::removeFromCurrentState() { mFlinger->markLayerPendingRemovalLocked(this); mFlinger->markLayerPendingRemovalLocked(this); } } sp<Layer> Layer::getRootLayer() { sp<Layer> parent = getParent(); if (parent == nullptr) { return this; } return parent->getRootLayer(); } void Layer::onRemovedFromCurrentState() { void Layer::onRemovedFromCurrentState() { auto layersInTree = getLayersInTree(LayerVector::StateSet::Current); // Use the root layer since we want to maintain the hierarchy for the entire subtree. auto layersInTree = getRootLayer()->getLayersInTree(LayerVector::StateSet::Current); std::sort(layersInTree.begin(), layersInTree.end()); std::sort(layersInTree.begin(), layersInTree.end()); for (const auto& layer : layersInTree) { traverse(LayerVector::StateSet::Current, [&](Layer* layer) { layer->removeFromCurrentState(); layer->removeFromCurrentState(); layer->removeRelativeZ(layersInTree); layer->removeRelativeZ(layersInTree); } }); } } void Layer::addToCurrentState() { void Layer::addToCurrentState() { Loading Loading @@ -2343,6 +2353,16 @@ bool Layer::isRemovedFromCurrentState() const { } } InputWindowInfo Layer::fillInputInfo() { InputWindowInfo Layer::fillInputInfo() { if (!hasInputInfo()) { mDrawingState.inputInfo.name = getName(); mDrawingState.inputInfo.ownerUid = mCallingUid; mDrawingState.inputInfo.ownerPid = mCallingPid; mDrawingState.inputInfo.inputFeatures = InputWindowInfo::INPUT_FEATURE_NO_INPUT_CHANNEL; mDrawingState.inputInfo.layoutParamsFlags = InputWindowInfo::FLAG_NOT_TOUCH_MODAL; mDrawingState.inputInfo.displayId = getLayerStack(); } InputWindowInfo info = mDrawingState.inputInfo; InputWindowInfo info = mDrawingState.inputInfo; info.id = sequence; info.id = sequence; Loading Loading @@ -2424,7 +2444,7 @@ sp<Layer> Layer::getClonedRoot() { return mDrawingParent.promote()->getClonedRoot(); return mDrawingParent.promote()->getClonedRoot(); } } bool Layer::hasInput() const { bool Layer::hasInputInfo() const { return mDrawingState.inputInfo.token != nullptr; return mDrawingState.inputInfo.token != nullptr; } } Loading