summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2019-06-04 16:07:44 -0700
committer Ady Abraham <adyabr@google.com> 2019-06-07 10:26:47 -0700
commit9c501aad4b9e80582a830df262bd3298742c97f7 (patch)
treeb5d75bd39a80b9fd934b632ec134d91a2783c078
parent9ce46b641a3c1636e539914c30c9f6b04aa7f8ce (diff)
DisplayEventDispatcher: use eConfigChangedDispatch
In order to get DISPLAY_EVENT_CONFIG_CHANGED, eConfigChangedDispatch needs to be used when creating DisplayEventDispatcher. Bug: 131688378 Test: adb shell /data/nativetest64/libsurfaceflinger_unittest/libsurfaceflinger_unittest Test: trigger config change and observe logcat Change-Id: I0de8037ee5b024b7d9729750f582be919087be41
-rw-r--r--core/java/android/view/Choreographer.java3
-rw-r--r--core/java/android/view/DisplayEventReceiver.java24
-rw-r--r--core/jni/android_view_DisplayEventReceiver.cpp15
-rw-r--r--libs/androidfw/DisplayEventDispatcher.cpp5
-rw-r--r--libs/androidfw/include/androidfw/DisplayEventDispatcher.h3
-rw-r--r--libs/hwui/renderthread/RenderThread.cpp4
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java2
7 files changed, 40 insertions, 16 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index c64386e8db79..e95b5caa4fa0 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -16,6 +16,7 @@
package android.view;
+import static android.view.DisplayEventReceiver.CONFIG_CHANGED_EVENT_SUPPRESS;
import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP;
import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER;
@@ -910,7 +911,7 @@ public final class Choreographer {
private int mFrame;
public FrameDisplayEventReceiver(Looper looper, int vsyncSource) {
- super(looper, vsyncSource);
+ super(looper, vsyncSource, CONFIG_CHANGED_EVENT_SUPPRESS);
}
// TODO(b/116025192): physicalDisplayId is ignored because SF only emits VSYNC events for
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index 60daddd663d5..91acc4638c26 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -53,6 +53,20 @@ public abstract class DisplayEventReceiver {
*/
public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1;
+ /**
+ * Specifies to suppress config changed events from being generated from Surface Flinger.
+ * <p>
+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h
+ */
+ public static final int CONFIG_CHANGED_EVENT_SUPPRESS = 0;
+
+ /**
+ * Specifies to generate config changed events from Surface Flinger.
+ * <p>
+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h
+ */
+ public static final int CONFIG_CHANGED_EVENT_DISPATCH = 1;
+
private static final String TAG = "DisplayEventReceiver";
private final CloseGuard mCloseGuard = CloseGuard.get();
@@ -65,7 +79,7 @@ public abstract class DisplayEventReceiver {
private MessageQueue mMessageQueue;
private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver,
- MessageQueue messageQueue, int vsyncSource);
+ MessageQueue messageQueue, int vsyncSource, int configChanged);
private static native void nativeDispose(long receiverPtr);
@FastNative
private static native void nativeScheduleVsync(long receiverPtr);
@@ -77,7 +91,7 @@ public abstract class DisplayEventReceiver {
*/
@UnsupportedAppUsage
public DisplayEventReceiver(Looper looper) {
- this(looper, VSYNC_SOURCE_APP);
+ this(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_SUPPRESS);
}
/**
@@ -85,15 +99,17 @@ public abstract class DisplayEventReceiver {
*
* @param looper The looper to use when invoking callbacks.
* @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values.
+ * @param configChanged Whether to dispatch config changed events. Must be one of the
+ * CONFIG_CHANGED_EVENT_* values.
*/
- public DisplayEventReceiver(Looper looper, int vsyncSource) {
+ public DisplayEventReceiver(Looper looper, int vsyncSource, int configChanged) {
if (looper == null) {
throw new IllegalArgumentException("looper must not be null");
}
mMessageQueue = looper.getQueue();
mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue,
- vsyncSource);
+ vsyncSource, configChanged);
mCloseGuard.open("dispose");
}
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index 8d702d11d8fe..ba538a855f81 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -48,7 +48,8 @@ static struct {
class NativeDisplayEventReceiver : public DisplayEventDispatcher {
public:
NativeDisplayEventReceiver(JNIEnv* env,
- jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource);
+ jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource,
+ jint configChanged);
void dispose();
@@ -68,9 +69,11 @@ private:
NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env,
- jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource) :
+ jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource,
+ jint configChanged) :
DisplayEventDispatcher(messageQueue->getLooper(),
- static_cast<ISurfaceComposer::VsyncSource>(vsyncSource)),
+ static_cast<ISurfaceComposer::VsyncSource>(vsyncSource),
+ static_cast<ISurfaceComposer::ConfigChanged>(configChanged)),
mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)),
mMessageQueue(messageQueue) {
ALOGV("receiver %p ~ Initializing display event receiver.", this);
@@ -136,7 +139,7 @@ void NativeDisplayEventReceiver::dispatchConfigChanged(nsecs_t timestamp,
static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak,
- jobject messageQueueObj, jint vsyncSource) {
+ jobject messageQueueObj, jint vsyncSource, jint configChanged) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized.");
@@ -144,7 +147,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak,
}
sp<NativeDisplayEventReceiver> receiver = new NativeDisplayEventReceiver(env,
- receiverWeak, messageQueue, vsyncSource);
+ receiverWeak, messageQueue, vsyncSource, configChanged);
status_t status = receiver->initialize();
if (status) {
String8 message;
@@ -179,7 +182,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) {
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "nativeInit",
- "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;I)J",
+ "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;II)J",
(void*)nativeInit },
{ "nativeDispose",
"(J)V",
diff --git a/libs/androidfw/DisplayEventDispatcher.cpp b/libs/androidfw/DisplayEventDispatcher.cpp
index 660614895603..d8a3f42690f4 100644
--- a/libs/androidfw/DisplayEventDispatcher.cpp
+++ b/libs/androidfw/DisplayEventDispatcher.cpp
@@ -34,8 +34,9 @@ namespace android {
static const size_t EVENT_BUFFER_SIZE = 100;
DisplayEventDispatcher::DisplayEventDispatcher(const sp<Looper>& looper,
- ISurfaceComposer::VsyncSource vsyncSource) :
- mLooper(looper), mReceiver(vsyncSource), mWaitingForVsync(false) {
+ ISurfaceComposer::VsyncSource vsyncSource,
+ ISurfaceComposer::ConfigChanged configChanged) :
+ mLooper(looper), mReceiver(vsyncSource, configChanged), mWaitingForVsync(false) {
ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this);
}
diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
index 5381c0174cb0..8bc25202b3ab 100644
--- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
+++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h
@@ -23,7 +23,8 @@ namespace android {
class DisplayEventDispatcher : public LooperCallback {
public:
explicit DisplayEventDispatcher(const sp<Looper>& looper,
- ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp);
+ ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp,
+ ISurfaceComposer::ConfigChanged configChanged = ISurfaceComposer::eConfigChangedSuppress);
status_t initialize();
void dispose();
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 41cb8fdc66bd..71c5b53f727a 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -156,7 +156,9 @@ void RenderThread::initializeDisplayEventReceiver() {
LOG_ALWAYS_FATAL_IF(mVsyncSource, "Initializing a second DisplayEventReceiver?");
if (!Properties::isolatedProcess) {
- auto receiver = std::make_unique<DisplayEventReceiver>();
+ auto receiver = std::make_unique<DisplayEventReceiver>(
+ ISurfaceComposer::eVsyncSourceApp,
+ ISurfaceComposer::eConfigChangedDispatch);
status_t status = receiver->initCheck();
LOG_ALWAYS_FATAL_IF(status != NO_ERROR,
"Initialization of DisplayEventReceiver "
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 85fbdf6d0182..b03dc3b2ae93 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -856,7 +856,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private final class PhysicalDisplayEventReceiver extends DisplayEventReceiver {
PhysicalDisplayEventReceiver(Looper looper) {
- super(looper, VSYNC_SOURCE_APP);
+ super(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_DISPATCH);
}
@Override