diff options
| author | 2019-03-22 13:38:56 -0700 | |
|---|---|---|
| committer | 2019-03-22 13:38:56 -0700 | |
| commit | 9245d3bf60f47e2f37d3bc859973307e3f08054f (patch) | |
| tree | 94dacb3ff53faee5d2b8ad6951562e4af420dccb | |
| parent | 9ae031a695d0eb190a34302aa9a95ebb4e0a085c (diff) | |
SF: Add trace section flags and InputWindowInfo to sf trace
Trace section flags allow users to specify sections of the trace to be collected. By default, all
sections are collected. Options are:
TRACE_CRITICAL - adds data critical for debugging
TRACE_INPUT - adds InputWindowInfo
TRACE_EXTRA - adds non essential data (metadata, derived data)
TRACE_ALL - includes all sections (default)
To set the trace flags from shell:
$ adb shell su root service call SurfaceFlinger 1033 i32 <trace_flags>
Bug: 123992966
Test: record and view sf trace
Change-Id: Icfd4d2bde08a4b3d04e37eca72ff505c7ea518f7
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 178 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/LayerProtoHelper.cpp | 36 | ||||
| -rw-r--r-- | services/surfaceflinger/LayerProtoHelper.h | 5 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 17 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTracing.cpp | 85 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTracing.h | 28 | ||||
| -rw-r--r-- | services/surfaceflinger/layerproto/layers.proto | 23 |
9 files changed, 250 insertions, 132 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 07fe03ee4d..898d37e787 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1845,7 +1845,8 @@ void Layer::setInputInfo(const InputWindowInfo& info) { setTransactionFlags(eTransactionNeeded); } -void Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) { +void Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet, + uint32_t traceFlags) { const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; const State& state = useDrawing ? mDrawingState : mCurrentState; @@ -1853,114 +1854,129 @@ void Layer::writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet) ui::Transform requestedTransform = state.active_legacy.transform; ui::Transform transform = getTransform(); - layerInfo->set_id(sequence); - layerInfo->set_name(getName().c_str()); - layerInfo->set_type(String8(getTypeId())); + if (traceFlags & SurfaceTracing::TRACE_CRITICAL) { + layerInfo->set_id(sequence); + layerInfo->set_name(getName().c_str()); + layerInfo->set_type(String8(getTypeId())); - for (const auto& child : children) { - layerInfo->add_children(child->sequence); - } - - for (const wp<Layer>& weakRelative : state.zOrderRelatives) { - sp<Layer> strongRelative = weakRelative.promote(); - if (strongRelative != nullptr) { - layerInfo->add_relatives(strongRelative->sequence); + for (const auto& child : children) { + layerInfo->add_children(child->sequence); } - } - LayerProtoHelper::writeToProto(state.activeTransparentRegion_legacy, - [&]() { return layerInfo->mutable_transparent_region(); }); - LayerProtoHelper::writeToProto(visibleRegion, - [&]() { return layerInfo->mutable_visible_region(); }); - LayerProtoHelper::writeToProto(surfaceDamageRegion, - [&]() { return layerInfo->mutable_damage_region(); }); + for (const wp<Layer>& weakRelative : state.zOrderRelatives) { + sp<Layer> strongRelative = weakRelative.promote(); + if (strongRelative != nullptr) { + layerInfo->add_relatives(strongRelative->sequence); + } + } - layerInfo->set_layer_stack(getLayerStack()); - layerInfo->set_z(state.z); + LayerProtoHelper::writeToProto(state.activeTransparentRegion_legacy, + [&]() { return layerInfo->mutable_transparent_region(); }); + LayerProtoHelper::writeToProto(visibleRegion, + [&]() { return layerInfo->mutable_visible_region(); }); + LayerProtoHelper::writeToProto(surfaceDamageRegion, + [&]() { return layerInfo->mutable_damage_region(); }); - LayerProtoHelper::writePositionToProto(transform.tx(), transform.ty(), - [&]() { return layerInfo->mutable_position(); }); + layerInfo->set_layer_stack(getLayerStack()); + layerInfo->set_z(state.z); - LayerProtoHelper::writePositionToProto(requestedTransform.tx(), requestedTransform.ty(), [&]() { - return layerInfo->mutable_requested_position(); - }); + LayerProtoHelper::writePositionToProto(transform.tx(), transform.ty(), + [&]() { return layerInfo->mutable_position(); }); - LayerProtoHelper::writeSizeToProto(state.active_legacy.w, state.active_legacy.h, - [&]() { return layerInfo->mutable_size(); }); + LayerProtoHelper::writePositionToProto(requestedTransform.tx(), requestedTransform.ty(), + [&]() { + return layerInfo->mutable_requested_position(); + }); - LayerProtoHelper::writeToProto(state.crop_legacy, [&]() { return layerInfo->mutable_crop(); }); - layerInfo->set_corner_radius(getRoundedCornerState().radius); + LayerProtoHelper::writeSizeToProto(state.active_legacy.w, state.active_legacy.h, + [&]() { return layerInfo->mutable_size(); }); - layerInfo->set_is_opaque(isOpaque(state)); - layerInfo->set_invalidate(contentDirty); + LayerProtoHelper::writeToProto(state.crop_legacy, + [&]() { return layerInfo->mutable_crop(); }); + layerInfo->set_corner_radius(getRoundedCornerState().radius); - // XXX (b/79210409) mCurrentDataSpace is not protected - layerInfo->set_dataspace(dataspaceDetails(static_cast<android_dataspace>(mCurrentDataSpace))); + layerInfo->set_is_opaque(isOpaque(state)); + layerInfo->set_invalidate(contentDirty); - layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); - LayerProtoHelper::writeToProto(getColor(), [&]() { return layerInfo->mutable_color(); }); - LayerProtoHelper::writeToProto(state.color, - [&]() { return layerInfo->mutable_requested_color(); }); - layerInfo->set_flags(state.flags); + // XXX (b/79210409) mCurrentDataSpace is not protected + layerInfo->set_dataspace( + dataspaceDetails(static_cast<android_dataspace>(mCurrentDataSpace))); - LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); - LayerProtoHelper::writeToProto(requestedTransform, layerInfo->mutable_requested_transform()); + layerInfo->set_pixel_format(decodePixelFormat(getPixelFormat())); + LayerProtoHelper::writeToProto(getColor(), [&]() { return layerInfo->mutable_color(); }); + LayerProtoHelper::writeToProto(state.color, + [&]() { return layerInfo->mutable_requested_color(); }); + layerInfo->set_flags(state.flags); - auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote(); - if (parent != nullptr) { - layerInfo->set_parent(parent->sequence); - } else { - layerInfo->set_parent(-1); - } + LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform()); + LayerProtoHelper::writeToProto(requestedTransform, + layerInfo->mutable_requested_transform()); - auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); - if (zOrderRelativeOf != nullptr) { - layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); - } else { - layerInfo->set_z_order_relative_of(-1); - } + auto parent = useDrawing ? mDrawingParent.promote() : mCurrentParent.promote(); + if (parent != nullptr) { + layerInfo->set_parent(parent->sequence); + } else { + layerInfo->set_parent(-1); + } - auto buffer = mActiveBuffer; - if (buffer != nullptr) { - LayerProtoHelper::writeToProto(buffer, - [&]() { return layerInfo->mutable_active_buffer(); }); - LayerProtoHelper::writeToProto(ui::Transform(mCurrentTransform), - layerInfo->mutable_buffer_transform()); - } + auto zOrderRelativeOf = state.zOrderRelativeOf.promote(); + if (zOrderRelativeOf != nullptr) { + layerInfo->set_z_order_relative_of(zOrderRelativeOf->sequence); + } else { + layerInfo->set_z_order_relative_of(-1); + } - layerInfo->set_queued_frames(getQueuedFrameCount()); - layerInfo->set_refresh_pending(isBufferLatched()); - layerInfo->set_curr_frame(mCurrentFrameNumber); - layerInfo->set_effective_scaling_mode(getEffectiveScalingMode()); + auto buffer = mActiveBuffer; + if (buffer != nullptr) { + LayerProtoHelper::writeToProto(buffer, + [&]() { return layerInfo->mutable_active_buffer(); }); + LayerProtoHelper::writeToProto(ui::Transform(mCurrentTransform), + layerInfo->mutable_buffer_transform()); + } - for (const auto& pendingState : mPendingStates) { - auto barrierLayer = pendingState.barrierLayer_legacy.promote(); - if (barrierLayer != nullptr) { - BarrierLayerProto* barrierLayerProto = layerInfo->add_barrier_layer(); - barrierLayerProto->set_id(barrierLayer->sequence); - barrierLayerProto->set_frame_number(pendingState.frameNumber_legacy); + layerInfo->set_queued_frames(getQueuedFrameCount()); + layerInfo->set_refresh_pending(isBufferLatched()); + layerInfo->set_curr_frame(mCurrentFrameNumber); + layerInfo->set_effective_scaling_mode(getEffectiveScalingMode()); + + for (const auto& pendingState : mPendingStates) { + auto barrierLayer = pendingState.barrierLayer_legacy.promote(); + if (barrierLayer != nullptr) { + BarrierLayerProto* barrierLayerProto = layerInfo->add_barrier_layer(); + barrierLayerProto->set_id(barrierLayer->sequence); + barrierLayerProto->set_frame_number(pendingState.frameNumber_legacy); + } } + LayerProtoHelper::writeToProto(mBounds, [&]() { return layerInfo->mutable_bounds(); }); } - auto protoMap = layerInfo->mutable_metadata(); - for (const auto& entry : state.metadata.mMap) { - (*protoMap)[entry.first] = std::string(entry.second.cbegin(), entry.second.cend()); + if (traceFlags & SurfaceTracing::TRACE_INPUT) { + LayerProtoHelper::writeToProto(state.inputInfo, state.touchableRegionCrop, + [&]() { return layerInfo->mutable_input_window_info(); }); + } + + if (traceFlags & SurfaceTracing::TRACE_EXTRA) { + auto protoMap = layerInfo->mutable_metadata(); + for (const auto& entry : state.metadata.mMap) { + (*protoMap)[entry.first] = std::string(entry.second.cbegin(), entry.second.cend()); + } + LayerProtoHelper::writeToProto(mEffectiveTransform, + layerInfo->mutable_effective_transform()); + LayerProtoHelper::writeToProto(mSourceBounds, + [&]() { return layerInfo->mutable_source_bounds(); }); + LayerProtoHelper::writeToProto(mScreenBounds, + [&]() { return layerInfo->mutable_screen_bounds(); }); } - LayerProtoHelper::writeToProto(mEffectiveTransform, layerInfo->mutable_effective_transform()); - LayerProtoHelper::writeToProto(mSourceBounds, - [&]() { return layerInfo->mutable_source_bounds(); }); - LayerProtoHelper::writeToProto(mScreenBounds, - [&]() { return layerInfo->mutable_screen_bounds(); }); - LayerProtoHelper::writeToProto(mBounds, [&]() { return layerInfo->mutable_bounds(); }); } -void Layer::writeToProto(LayerProto* layerInfo, const sp<DisplayDevice>& displayDevice) { +void Layer::writeToProto(LayerProto* layerInfo, const sp<DisplayDevice>& displayDevice, + uint32_t traceFlags) { auto outputLayer = findOutputLayerForDisplay(displayDevice); if (!outputLayer) { return; } - writeToProto(layerInfo, LayerVector::StateSet::Drawing); + writeToProto(layerInfo, LayerVector::StateSet::Drawing, traceFlags); const auto& compositionState = outputLayer->getState(); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index b7cfc1687a..83ff3b6cc9 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -433,10 +433,11 @@ public: bool isRemovedFromCurrentState() const; - void writeToProto(LayerProto* layerInfo, - LayerVector::StateSet stateSet = LayerVector::StateSet::Drawing); + void writeToProto(LayerProto* layerInfo, LayerVector::StateSet stateSet, + uint32_t traceFlags = SurfaceTracing::TRACE_ALL); - void writeToProto(LayerProto* layerInfo, const sp<DisplayDevice>& displayDevice); + void writeToProto(LayerProto* layerInfo, const sp<DisplayDevice>& displayDevice, + uint32_t traceFlags = SurfaceTracing::TRACE_ALL); virtual Geometry getActiveGeometry(const Layer::State& s) const { return s.active_legacy; } virtual uint32_t getActiveWidth(const Layer::State& s) const { return s.active_legacy.w; } diff --git a/services/surfaceflinger/LayerProtoHelper.cpp b/services/surfaceflinger/LayerProtoHelper.cpp index c25c418dc5..c94e439659 100644 --- a/services/surfaceflinger/LayerProtoHelper.cpp +++ b/services/surfaceflinger/LayerProtoHelper.cpp @@ -119,5 +119,41 @@ void LayerProtoHelper::writeToProto(const sp<GraphicBuffer>& buffer, } } +void LayerProtoHelper::writeToProto( + const InputWindowInfo& inputInfo, const wp<Layer>& touchableRegionBounds, + std::function<InputWindowInfoProto*()> getInputWindowInfoProto) { + if (inputInfo.token == nullptr) { + return; + } + + InputWindowInfoProto* proto = getInputWindowInfoProto(); + proto->set_layout_params_flags(inputInfo.layoutParamsFlags); + proto->set_layout_params_type(inputInfo.layoutParamsType); + + LayerProtoHelper::writeToProto({inputInfo.frameLeft, inputInfo.frameTop, inputInfo.frameRight, + inputInfo.frameBottom}, + [&]() { return proto->mutable_frame(); }); + LayerProtoHelper::writeToProto(inputInfo.touchableRegion, + [&]() { return proto->mutable_touchable_region(); }); + + proto->set_surface_inset(inputInfo.surfaceInset); + proto->set_visible(inputInfo.visible); + proto->set_can_receive_keys(inputInfo.canReceiveKeys); + proto->set_has_focus(inputInfo.hasFocus); + proto->set_has_wallpaper(inputInfo.hasWallpaper); + + proto->set_global_scale_factor(inputInfo.globalScaleFactor); + proto->set_window_x_scale(inputInfo.windowXScale); + proto->set_window_y_scale(inputInfo.windowYScale); + proto->set_replace_touchable_region_with_crop(inputInfo.replaceTouchableRegionWithCrop); + auto cropLayer = touchableRegionBounds.promote(); + if (cropLayer != nullptr) { + proto->set_crop_layer_id(cropLayer->sequence); + LayerProtoHelper::writeToProto(cropLayer->getScreenBounds( + false /* reduceTransparentRegion */), + [&]() { return proto->mutable_touchable_region_crop(); }); + } +} + } // namespace surfaceflinger } // namespace android diff --git a/services/surfaceflinger/LayerProtoHelper.h b/services/surfaceflinger/LayerProtoHelper.h index dca9a5e41f..1754a3f2d7 100644 --- a/services/surfaceflinger/LayerProtoHelper.h +++ b/services/surfaceflinger/LayerProtoHelper.h @@ -16,6 +16,8 @@ #include <layerproto/LayerProtoHeader.h> +#include <Layer.h> +#include <input/InputWindow.h> #include <math/vec4.h> #include <ui/GraphicBuffer.h> #include <ui/Rect.h> @@ -38,6 +40,9 @@ public: static void writeToProto(const ui::Transform& transform, TransformProto* transformProto); static void writeToProto(const sp<GraphicBuffer>& buffer, std::function<ActiveBufferProto*()> getActiveBufferProto); + static void writeToProto(const InputWindowInfo& inputInfo, + const wp<Layer>& touchableRegionBounds, + std::function<InputWindowInfoProto*()> getInputWindowInfoProto); }; } // namespace surfaceflinger diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 55fcb01f3c..f6251b8a4b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4644,13 +4644,14 @@ void SurfaceFlinger::dumpWideColorInfo(std::string& result) const { result.append("\n"); } -LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet) const { +LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet, + uint32_t traceFlags) const { LayersProto layersProto; const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; const State& state = useDrawing ? mDrawingState : mCurrentState; state.traverseInZOrder([&](Layer* layer) { LayerProto* layerProto = layersProto.add_layers(); - layer->writeToProto(layerProto, stateSet); + layer->writeToProto(layerProto, stateSet, traceFlags); }); return layersProto; @@ -4993,9 +4994,9 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { code == IBinder::SYSPROPS_TRANSACTION) { return OK; } - // Numbers from 1000 to 1032 are currently use for backdoors. The code + // Numbers from 1000 to 1033 are currently used for backdoors. The code // in onTransact verifies that the user is root, and has access to use SF. - if (code >= 1000 && code <= 1032) { + if (code >= 1000 && code <= 1033) { ALOGV("Accessing SurfaceFlinger through backdoor code: %u", code); return OK; } @@ -5303,6 +5304,14 @@ status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* r mDebugEnableProtectedContent = n; return NO_ERROR; } + // Set trace flags + case 1033: { + n = data.readUint32(); + ALOGD("Updating trace flags to 0x%x", n); + mTracing.setTraceFlags(n); + reply->writeInt32(NO_ERROR); + return NO_ERROR; + } } } return err; diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 0776a1eb96..3bf7c213c0 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -895,7 +895,8 @@ private: void dumpBufferingStats(std::string& result) const; void dumpDisplayIdentificationData(std::string& result) const; void dumpWideColorInfo(std::string& result) const; - LayersProto dumpProtoInfo(LayerVector::StateSet stateSet) const; + LayersProto dumpProtoInfo(LayerVector::StateSet stateSet, + uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const; void withTracingLock(std::function<void()> operation) REQUIRES(mStateLock); LayersProto dumpVisibleLayersProtoInfo(const sp<DisplayDevice>& display) const; diff --git a/services/surfaceflinger/SurfaceTracing.cpp b/services/surfaceflinger/SurfaceTracing.cpp index db78f1db2e..c4ab0668e7 100644 --- a/services/surfaceflinger/SurfaceTracing.cpp +++ b/services/surfaceflinger/SurfaceTracing.cpp @@ -28,46 +28,56 @@ namespace android { +SurfaceTracing::SurfaceTracing(SurfaceFlinger& flinger) + : mFlinger(flinger), mSfLock(flinger.mDrawingStateLock) {} + void SurfaceTracing::mainLoop() { + addFirstEntry(); bool enabled = true; - // Upon activation, logs the first frame - traceLayers("tracing.enable"); - do { - std::unique_lock<std::mutex> sfLock(mFlinger.mDrawingStateLock); - mConditionalVariable.wait(sfLock); - LayersTraceProto entry = traceLayersLocked(mWhere); - sfLock.unlock(); - { - std::scoped_lock bufferLock(mTraceLock); - mBuffer.emplace(std::move(entry)); - if (mWriteToFile) { - writeProtoFileLocked(); - mWriteToFile = false; - } - - enabled = mEnabled; - } - } while (enabled); + while (enabled) { + LayersTraceProto entry = traceWhenNotified(); + enabled = addTraceToBuffer(entry); + } +} + +void SurfaceTracing::addFirstEntry() { + LayersTraceProto entry; + { + std::scoped_lock lock(mSfLock); + entry = traceLayersLocked("tracing.enable"); + } + addTraceToBuffer(entry); +} + +LayersTraceProto SurfaceTracing::traceWhenNotified() { + std::unique_lock<std::mutex> lock(mSfLock); + mCanStartTrace.wait(lock); + android::base::ScopedLockAssertion assumeLock(mSfLock); + LayersTraceProto entry = traceLayersLocked(mWhere); + lock.unlock(); + return entry; } -void SurfaceTracing::traceLayers(const char* where) { - std::unique_lock<std::mutex> sfLock(mFlinger.mDrawingStateLock); - LayersTraceProto entry = traceLayersLocked(where); - sfLock.unlock(); - std::scoped_lock bufferLock(mTraceLock); +bool SurfaceTracing::addTraceToBuffer(LayersTraceProto& entry) { + std::scoped_lock lock(mTraceLock); mBuffer.emplace(std::move(entry)); + if (mWriteToFile) { + writeProtoFileLocked(); + mWriteToFile = false; + } + return mEnabled; } void SurfaceTracing::notify(const char* where) { - std::lock_guard<std::mutex> sfLock(mFlinger.mDrawingStateLock); + std::scoped_lock lock(mSfLock); mWhere = where; - mConditionalVariable.notify_one(); + mCanStartTrace.notify_one(); } void SurfaceTracing::writeToFileAsync() { - std::lock_guard<std::mutex> bufferLock(mTraceLock); + std::scoped_lock lock(mTraceLock); mWriteToFile = true; - mConditionalVariable.notify_one(); + mCanStartTrace.notify_one(); } void SurfaceTracing::LayersTraceBuffer::reset(size_t newSize) { @@ -102,12 +112,11 @@ void SurfaceTracing::LayersTraceBuffer::flush(LayersTraceFileProto* fileProto) { } void SurfaceTracing::enable() { - std::lock_guard<std::mutex> bufferLock(mTraceLock); + std::scoped_lock lock(mTraceLock); if (mEnabled) { return; } - mBuffer.reset(mBufferSize); mEnabled = true; mThread = std::thread(&SurfaceTracing::mainLoop, this); @@ -119,7 +128,7 @@ status_t SurfaceTracing::writeToFile() { } bool SurfaceTracing::disable() { - std::lock_guard<std::mutex> bufferLock(mTraceLock); + std::scoped_lock lock(mTraceLock); if (!mEnabled) { return false; @@ -127,28 +136,33 @@ bool SurfaceTracing::disable() { mEnabled = false; mWriteToFile = true; - mConditionalVariable.notify_all(); + mCanStartTrace.notify_all(); return true; } bool SurfaceTracing::isEnabled() const { - std::lock_guard<std::mutex> bufferLock(mTraceLock); + std::scoped_lock lock(mTraceLock); return mEnabled; } void SurfaceTracing::setBufferSize(size_t bufferSizeInByte) { - std::lock_guard<std::mutex> bufferLock(mTraceLock); + std::scoped_lock lock(mTraceLock); mBufferSize = bufferSizeInByte; mBuffer.setSize(bufferSizeInByte); } +void SurfaceTracing::setTraceFlags(uint32_t flags) { + std::scoped_lock lock(mSfLock); + mTraceFlags = flags; +} + LayersTraceProto SurfaceTracing::traceLayersLocked(const char* where) { ATRACE_CALL(); LayersTraceProto entry; entry.set_elapsed_realtime_nanos(elapsedRealtimeNano()); entry.set_where(where); - LayersProto layers(mFlinger.dumpProtoInfo(LayerVector::StateSet::Drawing)); + LayersProto layers(mFlinger.dumpProtoInfo(LayerVector::StateSet::Drawing, mTraceFlags)); entry.mutable_layers()->Swap(&layers); return entry; @@ -179,8 +193,7 @@ void SurfaceTracing::writeProtoFileLocked() { } void SurfaceTracing::dump(std::string& result) const { - std::lock_guard<std::mutex> bufferLock(mTraceLock); - + std::scoped_lock lock(mTraceLock); base::StringAppendF(&result, "Tracing state: %s\n", mEnabled ? "enabled" : "disabled"); base::StringAppendF(&result, " number of entries: %zu (%.2fMB / %.2fMB)\n", mBuffer.frameCount(), float(mBuffer.used()) / float(1_MB), diff --git a/services/surfaceflinger/SurfaceTracing.h b/services/surfaceflinger/SurfaceTracing.h index 94844803e9..4be2ee9f59 100644 --- a/services/surfaceflinger/SurfaceTracing.h +++ b/services/surfaceflinger/SurfaceTracing.h @@ -41,7 +41,7 @@ constexpr auto operator""_MB(unsigned long long const num) { */ class SurfaceTracing { public: - SurfaceTracing(SurfaceFlinger& flinger) : mFlinger(flinger) {} + SurfaceTracing(SurfaceFlinger& flinger); void enable(); bool disable(); status_t writeToFile(); @@ -52,6 +52,14 @@ public: void writeToFileAsync(); void dump(std::string& result) const; + enum : uint32_t { + TRACE_CRITICAL = 1 << 0, + TRACE_INPUT = 1 << 1, + TRACE_EXTRA = 1 << 2, + TRACE_ALL = 0xffffffff + }; + void setTraceFlags(uint32_t flags); + private: static constexpr auto kDefaultBufferCapInByte = 100_MB; static constexpr auto kDefaultFileName = "/data/misc/wmtrace/layers_trace.pb"; @@ -74,18 +82,24 @@ private: }; void mainLoop(); - void traceLayers(const char* where); - LayersTraceProto traceLayersLocked(const char* where); + void addFirstEntry(); + LayersTraceProto traceWhenNotified(); + LayersTraceProto traceLayersLocked(const char* where) REQUIRES(mSfLock); + + // Returns true if trace is enabled. + bool addTraceToBuffer(LayersTraceProto& entry); void writeProtoFileLocked() REQUIRES(mTraceLock); const SurfaceFlinger& mFlinger; - - const char* mWhere = ""; status_t mLastErr = NO_ERROR; std::thread mThread; - std::condition_variable mConditionalVariable; - mutable std::mutex mTraceLock; + std::condition_variable mCanStartTrace; + + std::mutex& mSfLock; + uint32_t mTraceFlags GUARDED_BY(mSfLock) = TRACE_ALL; + const char* mWhere GUARDED_BY(mSfLock) = ""; + mutable std::mutex mTraceLock; LayersTraceBuffer mBuffer GUARDED_BY(mTraceLock); size_t mBufferSize GUARDED_BY(mTraceLock) = kDefaultBufferCapInByte; bool mEnabled GUARDED_BY(mTraceLock) = false; diff --git a/services/surfaceflinger/layerproto/layers.proto b/services/surfaceflinger/layerproto/layers.proto index fd4695ecba..b097505bbc 100644 --- a/services/surfaceflinger/layerproto/layers.proto +++ b/services/surfaceflinger/layerproto/layers.proto @@ -96,6 +96,8 @@ message LayerProto { FloatRectProto source_bounds = 44; FloatRectProto bounds = 45; FloatRectProto screen_bounds = 46; + + InputWindowInfoProto input_window_info = 47; } message PositionProto { @@ -155,3 +157,24 @@ message BarrierLayerProto { // frame number the barrier is waiting on. uint64 frame_number = 2; } + +message InputWindowInfoProto { + uint32 layout_params_flags = 1; + uint32 layout_params_type = 2; + RectProto frame = 3; + RegionProto touchable_region = 4; + + uint32 surface_inset = 5; + bool visible = 6; + bool can_receive_keys = 7; + bool has_focus = 8; + bool has_wallpaper = 9; + + float global_scale_factor = 10; + float window_x_scale = 11; + float window_y_scale = 12; + + uint32 crop_layer_id = 13; + bool replace_touchable_region_with_crop = 14; + RectProto touchable_region_crop = 15; +} |