Merge "Eliminate latency when resampling is disabled" into klp-dev
diff --git a/include/gui/ISensorEventConnection.h b/include/gui/ISensorEventConnection.h
index 00eecc4..f64c6b8 100644
--- a/include/gui/ISensorEventConnection.h
+++ b/include/gui/ISensorEventConnection.h
@@ -39,7 +39,7 @@
virtual status_t enableDisable(int handle, bool enabled, nsecs_t samplingPeriodNs,
nsecs_t maxBatchReportLatencyNs, int reservedFlags) = 0;
virtual status_t setEventRate(int handle, nsecs_t ns) = 0;
- virtual status_t flushSensor(int handle) = 0;
+ virtual status_t flush() = 0;
};
// ----------------------------------------------------------------------------
diff --git a/include/gui/SensorEventQueue.h b/include/gui/SensorEventQueue.h
index a3a9daa..0bfc7a0 100644
--- a/include/gui/SensorEventQueue.h
+++ b/include/gui/SensorEventQueue.h
@@ -74,7 +74,7 @@
status_t enableSensor(int32_t handle, int32_t samplingPeriodUs, int maxBatchReportLatencyUs,
int reservedFlags) const;
status_t disableSensor(int32_t handle) const;
- status_t flushSensor(int32_t handle) const;
+ status_t flush() const;
private:
sp<Looper> getLooper() const;
diff --git a/libs/gui/ISensorEventConnection.cpp b/libs/gui/ISensorEventConnection.cpp
index a80c661..28fcb53 100644
--- a/libs/gui/ISensorEventConnection.cpp
+++ b/libs/gui/ISensorEventConnection.cpp
@@ -77,10 +77,9 @@
return reply.readInt32();
}
- virtual status_t flushSensor(int handle) {
+ virtual status_t flush() {
Parcel data, reply;
data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
- data.writeInt32(handle);
remote()->transact(FLUSH_SENSOR, data, &reply);
return reply.readInt32();
}
@@ -122,8 +121,7 @@
} break;
case FLUSH_SENSOR: {
CHECK_INTERFACE(ISensorEventConnection, data, reply);
- int handle = data.readInt32();
- status_t result = flushSensor(handle);
+ status_t result = flush();
reply->writeInt32(result);
return NO_ERROR;
} break;
diff --git a/libs/gui/SensorEventQueue.cpp b/libs/gui/SensorEventQueue.cpp
index ab50c1d..c365671 100644
--- a/libs/gui/SensorEventQueue.cpp
+++ b/libs/gui/SensorEventQueue.cpp
@@ -132,8 +132,8 @@
us2ns(maxBatchReportLatencyUs), reservedFlags);
}
-status_t SensorEventQueue::flushSensor(int32_t handle) const {
- return mSensorEventConnection->flushSensor(handle);
+status_t SensorEventQueue::flush() const {
+ return mSensorEventConnection->flush();
}
status_t SensorEventQueue::disableSensor(int32_t handle) const {
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index b26e572..af605de 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -679,8 +679,12 @@
int handle) {
if (mInitCheck != NO_ERROR) return mInitCheck;
SensorInterface* sensor = mSensorMap.valueFor(handle);
- if (sensor == NULL) {
- return BAD_VALUE;
+ if (sensor == NULL) {
+ return BAD_VALUE;
+ }
+ if (sensor->getSensor().getType() == SENSOR_TYPE_SIGNIFICANT_MOTION) {
+ ALOGE("flush called on Significant Motion sensor");
+ return INVALID_OPERATION;
}
SensorDevice& dev(SensorDevice::getInstance());
@@ -934,8 +938,18 @@
return mService->setEventRate(this, handle, samplingPeriodNs);
}
-status_t SensorService::SensorEventConnection::flushSensor(int handle) {
- return mService->flushSensor(this, handle);
+status_t SensorService::SensorEventConnection::flush() {
+ Mutex::Autolock _l(mConnectionLock);
+ status_t err(NO_ERROR);
+ for (size_t i = 0; i < mSensorInfo.size(); ++i) {
+ const int handle = mSensorInfo.keyAt(i);
+ status_t err_flush = mService->flushSensor(this, handle);
+ if (err_flush != NO_ERROR) {
+ ALOGE("Flush error handle=%d %s", handle, strerror(-err_flush));
+ }
+ err = (err_flush != NO_ERROR) ? err_flush : err;
+ }
+ return err;
}
// ---------------------------------------------------------------------------
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index 2311bff..2d40071 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -79,7 +79,7 @@
virtual status_t enableDisable(int handle, bool enabled, nsecs_t samplingPeriodNs,
nsecs_t maxBatchReportLatencyNs, int reservedFlags);
virtual status_t setEventRate(int handle, nsecs_t samplingPeriodNs);
- virtual status_t flushSensor(int handle);
+ virtual status_t flush();
// Count the number of flush complete events which are about to be dropped in the buffer.
// Increment mPendingFlushEventsToSend in mSensorInfo. These flush complete events will be
// sent separately before the next batch of events.
diff --git a/services/surfaceflinger/DispSync.cpp b/services/surfaceflinger/DispSync.cpp
index 7e67138..b2a604c 100644
--- a/services/surfaceflinger/DispSync.cpp
+++ b/services/surfaceflinger/DispSync.cpp
@@ -397,6 +397,7 @@
Mutex::Autolock lock(mMutex);
mPeriod = period;
mPhase = 0;
+ mThread->updateModel(mPeriod, mPhase);
}
void DispSync::updateModelLocked() {
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 3733ede..4a1373e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2982,6 +2982,27 @@
renderScreenImplLocked(hw, reqWidth, reqHeight,
minLayerZ, maxLayerZ, true);
+ // Create a sync point and wait on it, so we know the buffer is
+ // ready before we pass it along. We can't trivially call glFlush(),
+ // so we use a wait flag instead.
+ // TODO: pass a sync fd to queueBuffer() and let the consumer wait.
+ EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
+ if (sync != EGL_NO_SYNC_KHR) {
+ EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
+ EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
+ EGLint eglErr = eglGetError();
+ eglDestroySyncKHR(mEGLDisplay, sync);
+ if (result == EGL_TIMEOUT_EXPIRED_KHR) {
+ ALOGW("captureScreen: fence wait timed out");
+ } else {
+ ALOGW_IF(eglErr != EGL_SUCCESS,
+ "captureScreen: error waiting on EGL fence: %#x", eglErr);
+ }
+ } else {
+ ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
+ // not fatal
+ }
+
if (DEBUG_SCREENSHOTS) {
uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);