summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-04-06 17:19:48 -0700
committerJeff Brown <jeffbrown@google.com>2011-04-06 17:19:48 -0700
commitf6989da7c7727ad433b75ad2c8d8d23c2651f70b (patch)
tree6e128a7ed1e164a12fe155d6855743fb85b44490 /services
parent5487500cf3d9f6d7703ce0704cb91837aa95d716 (diff)
downloadframeworks_base-f6989da7c7727ad433b75ad2c8d8d23c2651f70b.zip
frameworks_base-f6989da7c7727ad433b75ad2c8d8d23c2651f70b.tar.gz
frameworks_base-f6989da7c7727ad433b75ad2c8d8d23c2651f70b.tar.bz2
Allow batching samples onto the pending motion event.
This enlarges the window of opportunity for batching to encompass time spent for the window to become ready (while it is busy processing the last event). Change-Id: I3fb5a394ab1b85d6591192678168ca6e35dd9d53
Diffstat (limited to 'services')
-rw-r--r--services/input/InputDispatcher.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 253d070..810b709 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -2524,6 +2524,34 @@ void InputDispatcher::notifyMotion(nsecs_t eventTime, int32_t deviceId, uint32_t
return; // done!
}
+ // BATCHING ONTO PENDING EVENT CASE
+ //
+ // Try to append a move sample to the currently pending event, if there is one.
+ // We can do this as long as we are still waiting to find the targets for the
+ // event. Once the targets are locked-in we can only do streaming.
+ if (mPendingEvent
+ && (!mPendingEvent->dispatchInProgress || !mCurrentInputTargetsValid)
+ && mPendingEvent->type == EventEntry::TYPE_MOTION) {
+ MotionEntry* motionEntry = static_cast<MotionEntry*>(mPendingEvent);
+ if (motionEntry->deviceId == deviceId && motionEntry->source == source) {
+ if (motionEntry->action != action
+ || motionEntry->pointerCount != pointerCount
+ || motionEntry->isInjected()) {
+ // Pending event is not compatible for appending new samples. Stop here.
+ goto NoBatchingOrStreaming;
+ }
+
+ // The pending motion event is a move and is compatible for appending.
+ // Do the batching magic.
+ mAllocator.appendMotionSample(motionEntry, eventTime, pointerCoords);
+#if DEBUG_BATCHING
+ LOGD("Appended motion sample onto batch for the pending motion event.");
+#endif
+ mLock.unlock();
+ return; // done!
+ }
+ }
+
// STREAMING CASE
//
// There is no pending motion event (of any kind) for this device in the inbound queue.