Merge "SurfaceFlinger: Validate layers before casting." into qt-dev
diff --git a/libs/gui/bufferqueue/2.0/types.cpp b/libs/gui/bufferqueue/2.0/types.cpp
index a110517..cbd6cad 100644
--- a/libs/gui/bufferqueue/2.0/types.cpp
+++ b/libs/gui/bufferqueue/2.0/types.cpp
@@ -289,6 +289,7 @@
return false;
}
*to = GraphicBuffer::fromAHardwareBuffer(hwBuffer);
+ AHardwareBuffer_release(hwBuffer);
return true;
}
diff --git a/libs/gui/bufferqueue/OWNERS b/libs/gui/bufferqueue/OWNERS
new file mode 100644
index 0000000..cbe9317
--- /dev/null
+++ b/libs/gui/bufferqueue/OWNERS
@@ -0,0 +1,5 @@
+chz@google.com
+lajos@google.com
+pawin@google.com
+taklee@google.com
+wonsik@google.com
diff --git a/opengl/tools/glgen/specs/egl/EGL15.spec b/opengl/tools/glgen/specs/egl/EGL15.spec
index e0aad30..5c48a15 100644
--- a/opengl/tools/glgen/specs/egl/EGL15.spec
+++ b/opengl/tools/glgen/specs/egl/EGL15.spec
@@ -1,7 +1,8 @@
EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list )
+// eglGetSyncAttrib pulled in with eglCreateSync stubs
+// EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value )
EGLBoolean eglDestroySync ( EGLDisplay dpy, EGLSync sync )
EGLint eglClientWaitSync ( EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout )
-EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value )
// NOTE: native_display isn't actually an EGLAttrib. Using EGLAttrib
// so that the generate creates mostly correct code (do not want a buffer)
// have to manually change cast to (void *) in generated code that calls
diff --git a/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp b/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp
index 1c53c9e..8bb0c6a 100644
--- a/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp
+++ b/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp
@@ -25,6 +25,7 @@
#include <utils/misc.h>
#include <assert.h>
+#include <vector>
#include <EGL/egl.h>
#include <ui/ANativeObjectBase.h>
@@ -206,4 +207,22 @@
return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
}
+struct WrappedEGLAttribs {
+private:
+ std::vector<EGLAttrib> backing; // only for 32-bit
+public:
+ EGLAttrib *attribs;
+ WrappedEGLAttribs(): attribs(nullptr) { };
+ void init(jlong *array, jint size) {
+ if (sizeof(EGLAttrib) != sizeof(jlong)) {
+ for (jint i = 0; i < size; ++i) {
+ backing.push_back(array[i]);
+ }
+ attribs = backing.data();
+ } else {
+ attribs = (EGLAttrib*)array;
+ }
+ }
+};
+
// --------------------------------------------------------------------------
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp b/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp
new file mode 100644
index 0000000..f93815c
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp
@@ -0,0 +1,50 @@
+/* EGLImage eglCreateImage ( EGLDisplay dpy, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list ) */
+static jobject
+android_eglCreateImage
+ (JNIEnv *_env, jobject _this, jobject dpy, jobject context, jint target, jlong buffer, jlongArray attrib_list_ref, jint offset) {
+ jint _exception = 0;
+ const char * _exceptionType = NULL;
+ const char * _exceptionMessage = NULL;
+ EGLImage _returnValue = (EGLImage) 0;
+ EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
+ EGLContext context_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, context);
+ jlong *attrib_list_base = (jlong *) 0;
+ jint _remaining;
+ WrappedEGLAttribs attrib_list;
+
+ if (!attrib_list_ref) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "attrib_list == null";
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "offset < 0";
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
+ attrib_list_base = (jlong *)
+ _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0);
+ attrib_list.init(attrib_list_base + offset, _remaining);
+
+ _returnValue = eglCreateImage(
+ (EGLDisplay)dpy_native,
+ (EGLContext)context_native,
+ (EGLenum)target,
+ (EGLClientBuffer)buffer,
+ attrib_list.attribs
+ );
+
+exit:
+ if (attrib_list_base) {
+ _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base,
+ JNI_ABORT);
+ }
+ if (_exception) {
+ jniThrowException(_env, _exceptionType, _exceptionMessage);
+ return nullptr;
+ }
+ return toEGLHandle(_env, eglimageClass, eglimageConstructor, _returnValue);
+}
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.java b/opengl/tools/glgen/stubs/egl/eglCreateImage.java
new file mode 100644
index 0000000..06a04bb
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.java
@@ -0,0 +1,11 @@
+ // C function EGLImage eglCreateImage ( EGLDisplay dpy, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list )
+
+ public static native EGLImage eglCreateImage(
+ EGLDisplay dpy,
+ EGLContext context,
+ int target,
+ long buffer,
+ long[] attrib_list,
+ int offset
+ );
+
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg
new file mode 100644
index 0000000..da5687d
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg
@@ -0,0 +1 @@
+{"eglCreateImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;IJ[JI)Landroid/opengl/EGLImage;", (void *) android_eglCreateImage },
diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp
new file mode 100644
index 0000000..48dbd35
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp
@@ -0,0 +1,68 @@
+/* EGLSurface eglCreatePlatformWindowSurface ( EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list ) */
+static jobject
+android_eglCreatePlatformWindowSurface
+ (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject native_window_buf, jlongArray attrib_list_ref, jint offset) {
+ jint _exception = 0;
+ const char * _exceptionType = NULL;
+ const char * _exceptionMessage = NULL;
+ jarray _array = (jarray) 0;
+ jint _bufferOffset = (jint) 0;
+ EGLSurface _returnValue = (EGLSurface) 0;
+ EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
+ EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
+ jint _native_windowRemaining;
+ void *native_window = (void *) 0;
+ jlong *attrib_list_base = (jlong *) 0;
+ jint _attrib_listRemaining;
+ WrappedEGLAttribs attrib_list;
+
+ if (!native_window_buf) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "native_window == null";
+ goto exit;
+ }
+ native_window = (void *)getPointer(_env, native_window_buf, (jarray*)&_array, &_native_windowRemaining, &_bufferOffset);
+ if (!attrib_list_ref) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "attrib_list == null";
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "offset < 0";
+ goto exit;
+ }
+ _attrib_listRemaining = _env->GetArrayLength(attrib_list_ref) - offset;
+ attrib_list_base = (jlong *)
+ _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0);
+ attrib_list.init(attrib_list_base + offset, _attrib_listRemaining);
+
+ if (native_window == NULL) {
+ char * _native_windowBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
+ native_window = (void *) (_native_windowBase + _bufferOffset);
+ }
+ _returnValue = eglCreatePlatformWindowSurface(
+ (EGLDisplay)dpy_native,
+ (EGLConfig)config_native,
+ (void *)native_window,
+ attrib_list.attribs
+ );
+
+exit:
+ if (attrib_list_base) {
+ _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base,
+ JNI_ABORT);
+ }
+ if (_array) {
+ releasePointer(_env, _array, native_window, _exception ? JNI_FALSE : JNI_TRUE);
+ }
+ if (_exception) {
+ jniThrowException(_env, _exceptionType, _exceptionMessage);
+ return nullptr;
+ }
+ return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
+}
+
diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java
new file mode 100644
index 0000000..dda37f8
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java
@@ -0,0 +1,10 @@
+ // C function EGLSurface eglCreatePlatformWindowSurface ( EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list )
+
+ public static native EGLSurface eglCreatePlatformWindowSurface(
+ EGLDisplay dpy,
+ EGLConfig config,
+ java.nio.Buffer native_window,
+ long[] attrib_list,
+ int offset
+ );
+
diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg
new file mode 100644
index 0000000..ce464e8
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg
@@ -0,0 +1 @@
+{"eglCreatePlatformWindowSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePlatformWindowSurface },
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp b/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp
new file mode 100644
index 0000000..c53afea
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp
@@ -0,0 +1,101 @@
+/* EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ) */
+static jobject
+android_eglCreateSync
+ (JNIEnv *_env, jobject _this, jobject dpy, jint type, jlongArray attrib_list_ref, jint offset) {
+ jint _exception = 0;
+ const char * _exceptionType = NULL;
+ const char * _exceptionMessage = NULL;
+ EGLSync _returnValue = (EGLSync) 0;
+ EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
+ jlong *attrib_list_base = (jlong *) 0;
+ jint _remaining;
+ WrappedEGLAttribs attrib_list;
+
+ if (!attrib_list_ref) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "attrib_list == null";
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "offset < 0";
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
+ attrib_list_base = (jlong *)
+ _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0);
+ attrib_list.init(attrib_list_base + offset, _remaining);
+
+ _returnValue = eglCreateSync(
+ (EGLDisplay)dpy_native,
+ (EGLenum)type,
+ attrib_list.attribs
+ );
+
+exit:
+ if (attrib_list_base) {
+ _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base,
+ JNI_ABORT);
+ }
+ if (_exception) {
+ jniThrowException(_env, _exceptionType, _exceptionMessage);
+ return nullptr;
+ }
+ return toEGLHandle(_env, eglsyncClass, eglsyncConstructor, _returnValue);
+}
+
+/* EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ) */
+static jboolean
+android_eglGetSyncAttrib
+ (JNIEnv *_env, jobject _this, jobject dpy, jobject sync, jint attribute, jlongArray value_ref, jint offset) {
+ jint _exception = 0;
+ const char * _exceptionType = NULL;
+ const char * _exceptionMessage = NULL;
+ EGLBoolean _returnValue = (EGLBoolean) 0;
+ EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
+ EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync);
+ jlong *value_base = (jlong *) 0;
+ jint _remaining;
+ EGLAttrib value;
+
+ if (!value_ref) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "value == null";
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _exceptionType = "java/lang/IllegalArgumentException";
+ _exceptionMessage = "offset < 0";
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(value_ref) - offset;
+ value_base = (jlong *)
+ _env->GetLongArrayElements(value_ref, (jboolean *)0);
+
+ _returnValue = eglGetSyncAttrib(
+ (EGLDisplay)dpy_native,
+ (EGLSync)sync_native,
+ (EGLint)attribute,
+ &value
+ );
+
+ if (value_base && _returnValue == EGL_TRUE) {
+ *(value_base + offset) = (jlong) value;
+ }
+
+exit:
+ if (value_base) {
+ _env->ReleaseLongArrayElements(value_ref, (jlong*)value_base,
+ _exception ? JNI_ABORT: 0);
+ }
+ if (_exception) {
+ jniThrowException(_env, _exceptionType, _exceptionMessage);
+ return JNI_FALSE;
+ }
+ return (jboolean)_returnValue;
+}
+
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.java b/opengl/tools/glgen/stubs/egl/eglCreateSync.java
new file mode 100644
index 0000000..db8f728
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.java
@@ -0,0 +1,22 @@
+ // C function EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list )
+
+ public static native EGLSync eglCreateSync(
+ EGLDisplay dpy,
+ int type,
+ long[] attrib_list,
+ int offset
+ );
+
+ /**
+ * C function EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute,
+ * EGLAttrib *value )
+ */
+
+ public static native boolean eglGetSyncAttrib(
+ EGLDisplay dpy,
+ EGLSync sync,
+ int attribute,
+ long[] value,
+ int offset
+ );
+
diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg
new file mode 100644
index 0000000..c99e7fe
--- /dev/null
+++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg
@@ -0,0 +1,2 @@
+{"eglCreateSync", "(Landroid/opengl/EGLDisplay;I[JI)Landroid/opengl/EGLSync;", (void *) android_eglCreateSync },
+{"eglGetSyncAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;I[JI)Z", (void *) android_eglGetSyncAttrib },
diff --git a/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp b/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp
index 3a6176f..6acb32a 100644
--- a/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp
+++ b/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp
@@ -6,9 +6,9 @@
const char * _exceptionType = NULL;
const char * _exceptionMessage = NULL;
EGLDisplay _returnValue = (EGLDisplay) 0;
- EGLAttrib *attrib_list_base = (EGLAttrib *) 0;
+ jlong *attrib_list_base = (jlong *) 0;
jint _remaining;
- EGLAttrib *attrib_list = (EGLAttrib *) 0;
+ WrappedEGLAttribs attrib_list;
if (!attrib_list_ref) {
_exception = 1;
@@ -23,14 +23,14 @@
goto exit;
}
_remaining = _env->GetArrayLength(attrib_list_ref) - offset;
- attrib_list_base = (EGLAttrib *)
+ attrib_list_base = (jlong *)
_env->GetLongArrayElements(attrib_list_ref, (jboolean *)0);
- attrib_list = attrib_list_base + offset;
+ attrib_list.init(attrib_list_base + offset, _remaining);
_returnValue = eglGetPlatformDisplay(
(EGLenum)platform,
(void *)native_display,
- (EGLAttrib *)attrib_list
+ attrib_list.attribs
);
exit:
diff --git a/services/inputflinger/EventHub.cpp b/services/inputflinger/EventHub.cpp
index 0544ec1..ce56272 100644
--- a/services/inputflinger/EventHub.cpp
+++ b/services/inputflinger/EventHub.cpp
@@ -115,8 +115,15 @@
* The system property ro.input.video_enabled can be used to control whether
* EventHub scans and opens V4L devices. As V4L does not support multiple
* clients, EventHub effectively blocks access to these devices when it opens
- * them. This property enables other clients to read these devices for testing
- * and development.
+ * them.
+ *
+ * Setting this to "false" would prevent any video devices from being discovered and
+ * associated with input devices.
+ *
+ * This property can be used as follows:
+ * 1. To turn off features that are dependent on video device presence.
+ * 2. During testing and development, to allow other clients to read video devices
+ * directly from /dev.
*/
static bool isV4lScanningEnabled() {
return property_get_bool("ro.input.video_enabled", true /* default_value */);
diff --git a/services/surfaceflinger/AllowedDisplayConfigs.h b/services/surfaceflinger/AllowedDisplayConfigs.h
deleted file mode 100644
index 7ca62ea..0000000
--- a/services/surfaceflinger/AllowedDisplayConfigs.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <log/log.h>
-#include <vector>
-
-/*
- * Used to represent the Display Configurations allowed to be set by SurfaceFlinger
- */
-class AllowedDisplayConfigs {
-private:
- // Defining ConstructorTag as private to prevent instantiating this class from outside
- // while still allowing it to be constructed by std::make_unique
- struct ConstructorTag {};
-
-public:
- AllowedDisplayConfigs(ConstructorTag) {}
-
- class Builder {
- public:
- Builder()
- : mAllowedDisplayConfigs(std::make_unique<AllowedDisplayConfigs>(ConstructorTag{})) {}
-
- std::unique_ptr<const AllowedDisplayConfigs> build() {
- return std::move(mAllowedDisplayConfigs);
- }
-
- // add a config to the allowed config set
- Builder& addConfig(int32_t config) {
- mAllowedDisplayConfigs->addConfig(config);
- return *this;
- }
-
- private:
- std::unique_ptr<AllowedDisplayConfigs> mAllowedDisplayConfigs;
- };
-
- bool isConfigAllowed(int32_t config) const {
- return (std::find(mConfigs.begin(), mConfigs.end(), config) != mConfigs.end());
- }
-
- void getAllowedConfigs(std::vector<int32_t>* outConfigs) const {
- if (outConfigs) {
- *outConfigs = mConfigs;
- }
- }
-
-private:
- // add a config to the allowed config set
- void addConfig(int32_t config) { mConfigs.push_back(config); }
-
- std::vector<int32_t> mConfigs;
-};
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 1716c17..d88702c 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -1803,7 +1803,8 @@
}
}
const float radius = getDrawingState().cornerRadius;
- return radius > 0 ? RoundedCornerState(getBounds(), radius) : RoundedCornerState();
+ return radius > 0 ? RoundedCornerState(getCrop(getDrawingState()).toFloatRect(), radius)
+ : RoundedCornerState();
}
void Layer::commitChildList() {
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
index 1aa6ade..5874066 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
+++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h
@@ -51,13 +51,7 @@
// TODO(b/122916473): Get this information from configs prepared by vendors, instead of
// baking them in.
- explicit RefreshRateConfigs(
- const std::vector<std::shared_ptr<const HWC2::Display::Config>>& configs) {
- init(configs);
- }
- ~RefreshRateConfigs() = default;
-
- const std::map<RefreshRateType, std::shared_ptr<RefreshRate>>& getRefreshRates() {
+ const std::map<RefreshRateType, std::shared_ptr<RefreshRate>>& getRefreshRates() const {
return mRefreshRates;
}
std::shared_ptr<RefreshRate> getRefreshRate(RefreshRateType type) {
@@ -68,8 +62,9 @@
return nullptr;
}
-private:
- void init(const std::vector<std::shared_ptr<const HWC2::Display::Config>>& configs) {
+ void populate(const std::vector<std::shared_ptr<const HWC2::Display::Config>>& configs) {
+ mRefreshRates.clear();
+
// This is the rate that HWC encapsulates right now when the device is in DOZE mode.
mRefreshRates.emplace(RefreshRateType::POWER_SAVING,
std::make_shared<RefreshRate>(
@@ -120,6 +115,7 @@
}
}
+private:
std::map<RefreshRateType, std::shared_ptr<RefreshRate>> mRefreshRates;
};
diff --git a/services/surfaceflinger/Scheduler/RefreshRateStats.h b/services/surfaceflinger/Scheduler/RefreshRateStats.h
index ff63faf..7e7c630 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateStats.h
+++ b/services/surfaceflinger/Scheduler/RefreshRateStats.h
@@ -41,12 +41,8 @@
static constexpr int64_t MS_PER_DAY = 24 * MS_PER_HOUR;
public:
- explicit RefreshRateStats(const std::shared_ptr<RefreshRateConfigs>& refreshRateConfigs,
- const std::shared_ptr<TimeStats>& timeStats)
- : mRefreshRateConfigs(refreshRateConfigs),
- mTimeStats(timeStats),
- mPreviousRecordedTime(systemTime()) {}
- ~RefreshRateStats() = default;
+ RefreshRateStats(const RefreshRateConfigs& refreshRateConfigs, TimeStats& timeStats)
+ : mRefreshRateConfigs(refreshRateConfigs), mTimeStats(timeStats) {}
// Sets power mode. We only collect the information when the power mode is not
// HWC_POWER_MODE_NORMAL. When power mode is HWC_POWER_MODE_NORMAL, we collect the stats based
@@ -83,7 +79,7 @@
flushTime();
std::unordered_map<std::string, int64_t> totalTime;
- for (auto [type, config] : mRefreshRateConfigs->getRefreshRates()) {
+ for (const auto& [type, config] : mRefreshRateConfigs.getRefreshRates()) {
int64_t totalTimeForConfig = 0;
if (!config) {
continue;
@@ -98,11 +94,11 @@
// Traverses through the map of config modes and returns how long they've been running in easy
// to read format.
- std::string doDump() {
+ std::string doDump() const {
std::ostringstream stream;
stream << "+ Refresh rate: running time in seconds\n";
- for (auto stats : getTotalTimes()) {
- stream << stats.first.c_str() << ": " << getDateFormatFromMs(stats.second) << "\n";
+ for (const auto& [name, time] : const_cast<RefreshRateStats*>(this)->getTotalTimes()) {
+ stream << name << ": " << getDateFormatFromMs(time) << '\n';
}
return stream.str();
}
@@ -126,12 +122,12 @@
mPreviousRecordedTime = currentTime;
mConfigModesTotalTime[mode] += timeElapsedMs;
- for (const auto& [type, config] : mRefreshRateConfigs->getRefreshRates()) {
+ for (const auto& [type, config] : mRefreshRateConfigs.getRefreshRates()) {
if (!config) {
continue;
}
if (config->configId == mode) {
- mTimeStats->recordRefreshRate(config->fps, timeElapsed);
+ mTimeStats.recordRefreshRate(config->fps, timeElapsed);
}
}
}
@@ -148,17 +144,17 @@
}
// Keeps information about refresh rate configs that device has.
- std::shared_ptr<RefreshRateConfigs> mRefreshRateConfigs;
+ const RefreshRateConfigs& mRefreshRateConfigs;
// Aggregate refresh rate statistics for telemetry.
- std::shared_ptr<TimeStats> mTimeStats;
+ TimeStats& mTimeStats;
int64_t mCurrentConfigMode = SCREEN_OFF_CONFIG_ID;
int32_t mCurrentPowerMode = HWC_POWER_MODE_OFF;
std::unordered_map<int /* power mode */, int64_t /* duration in ms */> mConfigModesTotalTime;
- nsecs_t mPreviousRecordedTime;
+ nsecs_t mPreviousRecordedTime = systemTime();
};
} // namespace scheduler
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 530ec30..cf552d6 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -558,14 +558,10 @@
mBootStage = BootStage::FINISHED;
// set the refresh rate according to the policy
- const auto displayId = getInternalDisplayIdLocked();
- LOG_ALWAYS_FATAL_IF(!displayId);
-
const auto& performanceRefreshRate =
- mRefreshRateConfigs[*displayId]->getRefreshRate(RefreshRateType::PERFORMANCE);
+ mRefreshRateConfigs.getRefreshRate(RefreshRateType::PERFORMANCE);
- if (performanceRefreshRate &&
- isConfigAllowed(*displayId, performanceRefreshRate->configId)) {
+ if (performanceRefreshRate && isDisplayConfigAllowed(performanceRefreshRate->configId)) {
setRefreshRateTo(RefreshRateType::PERFORMANCE, Scheduler::ConfigEvent::None);
} else {
setRefreshRateTo(RefreshRateType::DEFAULT, Scheduler::ConfigEvent::None);
@@ -706,12 +702,8 @@
setRefreshRateTo(type, event);
});
}
- mRefreshRateConfigs[*display->getId()] = std::make_shared<scheduler::RefreshRateConfigs>(
- getHwComposer().getConfigs(*display->getId()));
- mRefreshRateStats =
- std::make_unique<scheduler::RefreshRateStats>(mRefreshRateConfigs[*display->getId()],
- mTimeStats);
- mRefreshRateStats->setConfigMode(getHwComposer().getActiveConfigIndex(*display->getId()));
+ mRefreshRateConfigs.populate(getHwComposer().getConfigs(*display->getId()));
+ mRefreshRateStats.setConfigMode(getHwComposer().getActiveConfigIndex(*display->getId()));
ALOGV("Done initializing");
}
@@ -786,12 +778,14 @@
return NO_ERROR;
}
-status_t SurfaceFlinger::getDisplayConfigsLocked(const sp<IBinder>& displayToken,
- Vector<DisplayInfo>* configs) {
+status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken,
+ Vector<DisplayInfo>* configs) {
if (!displayToken || !configs) {
return BAD_VALUE;
}
+ Mutex::Autolock lock(mStateLock);
+
const auto displayId = getPhysicalDisplayIdLocked(displayToken);
if (!displayId) {
return NAME_NOT_FOUND;
@@ -917,18 +911,6 @@
void SurfaceFlinger::setDesiredActiveConfig(const ActiveConfigInfo& info) {
ATRACE_CALL();
- // Lock is acquired by setRefreshRateTo.
- const auto display = getDisplayDeviceLocked(info.displayToken);
- if (!display) {
- ALOGE("Attempt to set active config %d for invalid display token %p", info.configId,
- info.displayToken.get());
- return;
- }
- if (display->isVirtual()) {
- ALOGW("Attempt to set active config %d for virtual display", info.configId);
- return;
- }
-
// Don't check against the current mode yet. Worst case we set the desired
// config twice. However event generation config might have changed so we need to update it
// accordingly
@@ -964,23 +946,28 @@
void SurfaceFlinger::setActiveConfigInternal() {
ATRACE_CALL();
- std::lock_guard<std::mutex> lock(mActiveConfigLock);
- mRefreshRateStats->setConfigMode(mUpcomingActiveConfig.configId);
+ const auto display = getDefaultDisplayDeviceLocked();
+ if (!display) {
+ return;
+ }
- const auto display = getDisplayDeviceLocked(mUpcomingActiveConfig.displayToken);
+ std::lock_guard<std::mutex> lock(mActiveConfigLock);
+ mRefreshRateStats.setConfigMode(mUpcomingActiveConfig.configId);
+
display->setActiveConfig(mUpcomingActiveConfig.configId);
mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();
mVsyncModulator.setPhaseOffsets(early, gl, late);
ATRACE_INT("ActiveConfigMode", mUpcomingActiveConfig.configId);
+
if (mUpcomingActiveConfig.event != Scheduler::ConfigEvent::None) {
mScheduler->onConfigChanged(mAppConnectionHandle, display->getId()->value,
mUpcomingActiveConfig.configId);
}
}
-bool SurfaceFlinger::performSetActiveConfig() NO_THREAD_SAFETY_ANALYSIS {
+bool SurfaceFlinger::performSetActiveConfig() {
ATRACE_CALL();
if (mCheckPendingFence) {
if (mPreviousPresentFence != Fence::NO_FENCE &&
@@ -1006,7 +993,7 @@
desiredActiveConfig = mDesiredActiveConfig;
}
- const auto display = getDisplayDevice(desiredActiveConfig.displayToken);
+ const auto display = getDefaultDisplayDeviceLocked();
if (!display || display->getActiveConfig() == desiredActiveConfig.configId) {
// display is not valid or we are already in the requested mode
// on both cases there is nothing left to do
@@ -1021,7 +1008,7 @@
// Desired active config was set, it is different than the config currently in use, however
// allowed configs might have change by the time we process the refresh.
// Make sure the desired config is still allowed
- if (!isConfigAllowed(*display->getId(), desiredActiveConfig.configId)) {
+ if (!isDisplayConfigAllowed(desiredActiveConfig.configId)) {
std::lock_guard<std::mutex> lock(mActiveConfigLock);
mDesiredActiveConfig.configId = display->getActiveConfig();
return false;
@@ -1422,29 +1409,19 @@
*compositorTiming = getBE().mCompositorTiming;
}
-bool SurfaceFlinger::isConfigAllowed(const DisplayId& displayId, int32_t config) {
- std::lock_guard lock(mAllowedConfigsLock);
-
- // if allowed configs are not set yet for this display, every config is considered allowed
- if (mAllowedConfigs.find(displayId) == mAllowedConfigs.end()) {
- return true;
- }
-
- return mAllowedConfigs[displayId]->isConfigAllowed(config);
+bool SurfaceFlinger::isDisplayConfigAllowed(int32_t configId) {
+ return mAllowedDisplayConfigs.empty() || mAllowedDisplayConfigs.count(configId);
}
void SurfaceFlinger::setRefreshRateTo(RefreshRateType refreshRate, Scheduler::ConfigEvent event) {
- if (mBootStage != BootStage::FINISHED) {
+ const auto display = getDefaultDisplayDeviceLocked();
+ if (!display || mBootStage != BootStage::FINISHED) {
return;
}
ATRACE_CALL();
// Don't do any updating if the current fps is the same as the new one.
- const auto displayId = getInternalDisplayIdLocked();
- LOG_ALWAYS_FATAL_IF(!displayId);
- const auto displayToken = getInternalDisplayTokenLocked();
-
- const auto& refreshRateConfig = mRefreshRateConfigs[*displayId]->getRefreshRate(refreshRate);
+ const auto& refreshRateConfig = mRefreshRateConfigs.getRefreshRate(refreshRate);
if (!refreshRateConfig) {
ALOGV("Skipping refresh rate change request for unsupported rate.");
return;
@@ -1452,19 +1429,18 @@
const int desiredConfigId = refreshRateConfig->configId;
- if (!isConfigAllowed(*displayId, desiredConfigId)) {
+ if (!isDisplayConfigAllowed(desiredConfigId)) {
ALOGV("Skipping config %d as it is not part of allowed configs", desiredConfigId);
return;
}
mPhaseOffsets->setRefreshRateType(refreshRate);
- const auto display = getDisplayDeviceLocked(displayToken);
if (desiredConfigId == display->getActiveConfig()) {
return;
}
- setDesiredActiveConfig({refreshRate, desiredConfigId, getInternalDisplayTokenLocked(), event});
+ setDesiredActiveConfig({refreshRate, desiredConfigId, event});
}
void SurfaceFlinger::onHotplugReceived(int32_t sequenceId, hwc2_display_t hwcDisplayId,
@@ -1604,7 +1580,7 @@
setTransactionFlags(eDisplayTransactionNeeded);
}
-void SurfaceFlinger::onMessageReceived(int32_t what) {
+void SurfaceFlinger::onMessageReceived(int32_t what) NO_THREAD_SAFETY_ANALYSIS {
ATRACE_CALL();
switch (what) {
case MessageQueue::INVALIDATE: {
@@ -2483,9 +2459,6 @@
state.displayName = info->name;
mCurrentState.displays.add(mPhysicalDisplayTokens[info->id], state);
mInterceptor->saveDisplayCreation(state);
- // TODO(b/123715322): Removes the per-display state that was added to the scheduler.
- mRefreshRateConfigs[info->id] = std::make_shared<scheduler::RefreshRateConfigs>(
- getHwComposer().getConfigs(info->id));
}
} else {
ALOGV("Removing display %s", to_string(info->id).c_str());
@@ -2497,7 +2470,6 @@
mCurrentState.displays.removeItemsAt(index);
}
mPhysicalDisplayTokens.erase(info->id);
- mRefreshRateConfigs.erase(info->id);
}
processDisplayChangesLocked();
@@ -3402,9 +3374,8 @@
renderEngine.drawLayers(clientCompositionDisplay, clientCompositionLayers,
buf->getNativeBuffer(), /*useFramebufferCache=*/true, std::move(fd),
readyFence);
- if (expensiveRenderingExpected && displayId) {
- mPowerAdvisor.setExpensiveRenderingExpected(*displayId, false);
- }
+ } else if (displayId) {
+ mPowerAdvisor.setExpensiveRenderingExpected(*displayId, false);
}
return true;
}
@@ -4366,10 +4337,7 @@
if (display->isPrimary()) {
mTimeStats->setPowerMode(mode);
- if (mRefreshRateStats) {
- // Update refresh rate stats.
- mRefreshRateStats->setPowerMode(mode);
- }
+ mRefreshRateStats.setPowerMode(mode);
}
ALOGD("Finished setting power mode %d on display %s", mode, to_string(*displayId).c_str());
@@ -4897,7 +4865,7 @@
result.append("\nScheduler state:\n");
result.append(mScheduler->doDump() + "\n");
StringAppendF(&result, "+ Smart video mode: %s\n\n", mUseSmart90ForVideo ? "on" : "off");
- result.append(mRefreshRateStats->doDump() + "\n");
+ result.append(mRefreshRateStats.doDump() + "\n");
}
const Vector<sp<Layer>>& SurfaceFlinger::getLayerSortedByZForHwcDisplay(DisplayId displayId) {
@@ -5841,95 +5809,66 @@
}
}
-void SurfaceFlinger::setAllowedDisplayConfigsInternal(
- const android::sp<android::IBinder>& displayToken,
- std::unique_ptr<const AllowedDisplayConfigs>&& allowedConfigs) {
- const auto displayId = getPhysicalDisplayIdLocked(displayToken);
- if (!displayId) {
- ALOGE("setAllowedDisplayConfigsInternal: getPhysicalDisplayId failed");
+void SurfaceFlinger::setAllowedDisplayConfigsInternal(const sp<DisplayDevice>& display,
+ const std::vector<int32_t>& allowedConfigs) {
+ if (!display->isPrimary()) {
return;
}
ALOGV("Updating allowed configs");
- {
- std::lock_guard lock(mAllowedConfigsLock);
- mAllowedConfigs[*displayId] = std::move(allowedConfigs);
- }
+ mAllowedDisplayConfigs = DisplayConfigs(allowedConfigs.begin(), allowedConfigs.end());
// Set the highest allowed config by iterating backwards on available refresh rates
- const auto& refreshRates = mRefreshRateConfigs[*displayId]->getRefreshRates();
+ const auto& refreshRates = mRefreshRateConfigs.getRefreshRates();
for (auto iter = refreshRates.crbegin(); iter != refreshRates.crend(); ++iter) {
- if (iter->second && isConfigAllowed(*displayId, iter->second->configId)) {
+ if (iter->second && isDisplayConfigAllowed(iter->second->configId)) {
ALOGV("switching to config %d", iter->second->configId);
- setDesiredActiveConfig({iter->first, iter->second->configId, displayToken,
- Scheduler::ConfigEvent::Changed});
+ setDesiredActiveConfig(
+ {iter->first, iter->second->configId, Scheduler::ConfigEvent::Changed});
break;
}
}
}
-status_t SurfaceFlinger::setAllowedDisplayConfigs(const android::sp<android::IBinder>& displayToken,
+status_t SurfaceFlinger::setAllowedDisplayConfigs(const sp<IBinder>& displayToken,
const std::vector<int32_t>& allowedConfigs) {
ATRACE_CALL();
- if (!displayToken) {
- ALOGE("setAllowedDisplayConfigs: displayToken is null");
+ if (!displayToken || allowedConfigs.empty()) {
return BAD_VALUE;
}
- if (!allowedConfigs.size()) {
- ALOGE("setAllowedDisplayConfigs: empty config set provided");
- return BAD_VALUE;
- }
-
- {
- ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
- const auto displayId = getPhysicalDisplayIdLocked(displayToken);
- if (!displayId) {
- ALOGE("setAllowedDisplayConfigs: display not found");
- return NAME_NOT_FOUND;
- }
- }
-
- auto allowedDisplayConfigsBuilder = AllowedDisplayConfigs::Builder();
- for (int config : allowedConfigs) {
- ALOGV("setAllowedDisplayConfigs: Adding config to the allowed configs = %d", config);
- allowedDisplayConfigsBuilder.addConfig(config);
- }
- auto allowedDisplayConfigs = allowedDisplayConfigsBuilder.build();
postMessageSync(new LambdaMessage([&]() NO_THREAD_SAFETY_ANALYSIS {
- setAllowedDisplayConfigsInternal(displayToken, std::move(allowedDisplayConfigs));
+ const auto display = getDisplayDeviceLocked(displayToken);
+ if (!display) {
+ ALOGE("Attempt to set allowed display configs for invalid display token %p",
+ displayToken.get());
+ } else if (display->isVirtual()) {
+ ALOGW("Attempt to set allowed display configs for virtual display");
+ } else {
+ setAllowedDisplayConfigsInternal(display, allowedConfigs);
+ }
}));
+
return NO_ERROR;
}
-status_t SurfaceFlinger::getAllowedDisplayConfigs(const android::sp<android::IBinder>& displayToken,
+status_t SurfaceFlinger::getAllowedDisplayConfigs(const sp<IBinder>& displayToken,
std::vector<int32_t>* outAllowedConfigs) {
ATRACE_CALL();
- if (!displayToken) {
- ALOGE("getAllowedDisplayConfigs: displayToken is null");
+ if (!displayToken || !outAllowedConfigs) {
return BAD_VALUE;
}
- if (!outAllowedConfigs) {
- ALOGE("getAllowedDisplayConfigs: outAllowedConfigs is null");
- return BAD_VALUE;
- }
+ Mutex::Autolock lock(mStateLock);
- ConditionalLock stateLock(mStateLock, std::this_thread::get_id() != mMainThreadId);
- const auto displayId = getPhysicalDisplayIdLocked(displayToken);
- if (!displayId) {
- ALOGE("getAllowedDisplayConfigs: display not found");
+ if (displayToken != getInternalDisplayTokenLocked()) {
+ ALOGE("%s is only supported for the internal display", __FUNCTION__);
return NAME_NOT_FOUND;
}
- std::lock_guard allowedConfigLock(mAllowedConfigsLock);
- auto allowedConfigIterator = mAllowedConfigs.find(displayId.value());
- if (allowedConfigIterator != mAllowedConfigs.end()) {
- allowedConfigIterator->second->getAllowedConfigs(outAllowedConfigs);
- }
-
+ outAllowedConfigs->assign(mAllowedDisplayConfigs.begin(), mAllowedDisplayConfigs.end());
return NO_ERROR;
}
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index c0c0880..85a4580 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -46,7 +46,6 @@
#include <utils/Trace.h>
#include <utils/threads.h>
-#include "AllowedDisplayConfigs.h"
#include "DisplayDevice.h"
#include "DisplayHardware/HWC2.h"
#include "DisplayHardware/PowerAdvisor.h"
@@ -74,6 +73,7 @@
#include <thread>
#include <type_traits>
#include <unordered_map>
+#include <unordered_set>
#include <utility>
using namespace android::surfaceflinger;
@@ -409,12 +409,7 @@
float frameScale, bool childrenOnly) override;
status_t getDisplayStats(const sp<IBinder>& displayToken, DisplayStatInfo* stats) override;
status_t getDisplayConfigs(const sp<IBinder>& displayToken,
- Vector<DisplayInfo>* configs) override {
- Mutex::Autolock _l(mStateLock);
- return getDisplayConfigsLocked(displayToken, configs);
- }
- status_t getDisplayConfigsLocked(const sp<IBinder>& displayToken, Vector<DisplayInfo>* configs)
- REQUIRES(mStateLock);
+ Vector<DisplayInfo>* configs) override;
int getActiveConfig(const sp<IBinder>& displayToken) override;
status_t getDisplayColorModes(const sp<IBinder>& displayToken,
Vector<ui::ColorMode>* configs) override;
@@ -493,20 +488,10 @@
struct ActiveConfigInfo {
RefreshRateType type;
int configId;
- sp<IBinder> displayToken;
Scheduler::ConfigEvent event;
bool operator!=(const ActiveConfigInfo& other) const {
- if (type != other.type) {
- return true;
- }
- if (configId != other.configId) {
- return true;
- }
- if (displayToken != other.displayToken) {
- return true;
- }
- return (event != other.event);
+ return type != other.type || configId != other.configId || event != other.event;
}
};
@@ -521,14 +506,14 @@
// desired config was set, HWC needs to update the panel on the next refresh, and when
// we receive the fence back, we know that the process was complete. It returns whether
// we need to wait for the next invalidate
- bool performSetActiveConfig();
+ bool performSetActiveConfig() REQUIRES(mStateLock);
// called on the main thread in response to setPowerMode()
void setPowerModeInternal(const sp<DisplayDevice>& display, int mode) REQUIRES(mStateLock);
// called on the main thread in response to setAllowedDisplayConfigs()
- void setAllowedDisplayConfigsInternal(
- const sp<IBinder>& displayToken,
- std::unique_ptr<const AllowedDisplayConfigs>&& allowedConfigs) REQUIRES(mStateLock);
+ void setAllowedDisplayConfigsInternal(const sp<DisplayDevice>& display,
+ const std::vector<int32_t>& allowedConfigs)
+ REQUIRES(mStateLock);
// Returns whether the transaction actually modified any state
bool handleMessageTransaction();
@@ -808,7 +793,7 @@
// the desired refresh rate.
void setRefreshRateTo(RefreshRateType, Scheduler::ConfigEvent event) REQUIRES(mStateLock);
- bool isConfigAllowed(const DisplayId& displayId, int32_t config);
+ bool isDisplayConfigAllowed(int32_t configId) REQUIRES(mStateLock);
/*
* Display identification
@@ -1117,14 +1102,13 @@
std::unique_ptr<Scheduler> mScheduler;
sp<Scheduler::ConnectionHandle> mAppConnectionHandle;
sp<Scheduler::ConnectionHandle> mSfConnectionHandle;
- std::unique_ptr<scheduler::RefreshRateStats> mRefreshRateStats;
- std::unordered_map<DisplayId, std::shared_ptr<scheduler::RefreshRateConfigs>>
- mRefreshRateConfigs;
+ scheduler::RefreshRateConfigs mRefreshRateConfigs;
+ scheduler::RefreshRateStats mRefreshRateStats{mRefreshRateConfigs, *mTimeStats};
- std::mutex mAllowedConfigsLock;
- std::unordered_map<DisplayId, std::unique_ptr<const AllowedDisplayConfigs>> mAllowedConfigs
- GUARDED_BY(mAllowedConfigsLock);
+ // All configs are allowed if the set is empty.
+ using DisplayConfigs = std::unordered_set<int32_t>;
+ DisplayConfigs mAllowedDisplayConfigs GUARDED_BY(mStateLock);
std::mutex mActiveConfigLock;
// This bit is set once we start setting the config. We read from this bit during the
diff --git a/services/surfaceflinger/tests/unittests/AllowedDisplayConfigsTest.cpp b/services/surfaceflinger/tests/unittests/AllowedDisplayConfigsTest.cpp
deleted file mode 100644
index 4274254..0000000
--- a/services/surfaceflinger/tests/unittests/AllowedDisplayConfigsTest.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef LOG_TAG
-#define LOG_TAG "LibSurfaceFlingerUnittests"
-#define LOG_NDEBUG 0
-
-#include <memory>
-#include <vector>
-
-#include <gtest/gtest.h>
-
-#include <log/log.h>
-
-#include "AllowedDisplayConfigs.h"
-
-namespace android {
-namespace {
-
-class AllowedDisplayConfigsTest : public testing::Test {
-protected:
- AllowedDisplayConfigsTest();
- ~AllowedDisplayConfigsTest() override;
-
- void buildAllowedConfigs();
-
- const std::vector<int32_t> expectedConfigs = {0, 2, 7, 129};
- constexpr static int32_t notAllowedConfig = 5;
- std::unique_ptr<const AllowedDisplayConfigs> mAllowedConfigs;
-};
-
-AllowedDisplayConfigsTest::AllowedDisplayConfigsTest() {
- const ::testing::TestInfo* const test_info =
- ::testing::UnitTest::GetInstance()->current_test_info();
- ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
-}
-
-AllowedDisplayConfigsTest::~AllowedDisplayConfigsTest() {
- const ::testing::TestInfo* const test_info =
- ::testing::UnitTest::GetInstance()->current_test_info();
- ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
-}
-
-void AllowedDisplayConfigsTest::buildAllowedConfigs() {
- AllowedDisplayConfigs::Builder builder;
- for (int config : expectedConfigs) {
- builder.addConfig(config);
- }
- mAllowedConfigs = builder.build();
-}
-
-/* ------------------------------------------------------------------------
- * Test cases
- */
-
-TEST_F(AllowedDisplayConfigsTest, checkConfigs) {
- buildAllowedConfigs();
-
- // Check that all expected configs are allowed
- for (int config : expectedConfigs) {
- EXPECT_TRUE(mAllowedConfigs->isConfigAllowed(config));
- }
-
- // Check that all the allowed configs are expected
- std::vector<int32_t> allowedConfigVector;
- mAllowedConfigs->getAllowedConfigs(&allowedConfigVector);
- EXPECT_EQ(allowedConfigVector, expectedConfigs);
-
- // Check that notAllowedConfig is indeed not allowed
- EXPECT_TRUE(std::find(expectedConfigs.begin(), expectedConfigs.end(), notAllowedConfig) ==
- expectedConfigs.end());
- EXPECT_FALSE(mAllowedConfigs->isConfigAllowed(notAllowedConfig));
-}
-
-TEST_F(AllowedDisplayConfigsTest, getAllowedConfigsNullptr) {
- buildAllowedConfigs();
-
- // No other expectations rather than no crash
- mAllowedConfigs->getAllowedConfigs(nullptr);
-}
-
-} // namespace
-} // namespace android
diff --git a/services/surfaceflinger/tests/unittests/Android.bp b/services/surfaceflinger/tests/unittests/Android.bp
index d4eac88..85e9ce5 100644
--- a/services/surfaceflinger/tests/unittests/Android.bp
+++ b/services/surfaceflinger/tests/unittests/Android.bp
@@ -35,7 +35,6 @@
srcs: [
":libsurfaceflinger_sources",
"libsurfaceflinger_unittest_main.cpp",
- "AllowedDisplayConfigsTest.cpp",
"CompositionTest.cpp",
"DispSyncSourceTest.cpp",
"DisplayIdentificationTest.cpp",
diff --git a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
index b218ad6..8b37c22 100644
--- a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
+++ b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
@@ -49,6 +49,8 @@
ASSERT_EQ(left.name, right.name);
ASSERT_EQ(left.fps, right.fps);
}
+
+ RefreshRateConfigs mConfigs;
};
RefreshRateConfigsTest::RefreshRateConfigsTest() {
@@ -69,10 +71,10 @@
*/
TEST_F(RefreshRateConfigsTest, zeroDeviceConfigs_storesPowerSavingConfig) {
std::vector<std::shared_ptr<const HWC2::Display::Config>> displayConfigs;
- RefreshRateConfigs configs(displayConfigs);
+ mConfigs.populate(displayConfigs);
// We always store a configuration for screen off.
- const auto& rates = configs.getRefreshRates();
+ const auto& rates = mConfigs.getRefreshRates();
ASSERT_EQ(1, rates.size());
const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING);
ASSERT_NE(rates.end(), powerSavingRate);
@@ -82,13 +84,13 @@
RefreshRate expectedConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0};
assertRatesEqual(expectedConfig, *powerSavingRate->second);
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::POWER_SAVING));
- assertRatesEqual(expectedConfig, *configs.getRefreshRate(RefreshRateType::POWER_SAVING));
- ASSERT_FALSE(configs.getRefreshRate(RefreshRateType::PERFORMANCE));
- ASSERT_FALSE(configs.getRefreshRate(RefreshRateType::DEFAULT));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ assertRatesEqual(expectedConfig, *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE));
+ ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT));
// Sanity check that getRefreshRate() does not modify the underlying configs.
- ASSERT_EQ(1, configs.getRefreshRates().size());
+ ASSERT_EQ(1, mConfigs.getRefreshRates().size());
}
TEST_F(RefreshRateConfigsTest, oneDeviceConfig_storesDefaultConfig) {
@@ -97,9 +99,9 @@
auto config60 = HWC2::Display::Config::Builder(*display, CONFIG_ID_60);
config60.setVsyncPeriod(VSYNC_60);
displayConfigs.push_back(config60.build());
- RefreshRateConfigs configs(displayConfigs);
+ mConfigs.populate(displayConfigs);
- const auto& rates = configs.getRefreshRates();
+ const auto& rates = mConfigs.getRefreshRates();
ASSERT_EQ(2, rates.size());
const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING);
const auto& defaultRate = rates.find(RefreshRateType::DEFAULT);
@@ -112,15 +114,15 @@
RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60};
assertRatesEqual(expectedDefaultConfig, *defaultRate->second);
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
assertRatesEqual(expectedPowerSavingConfig,
- *configs.getRefreshRate(RefreshRateType::POWER_SAVING));
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::DEFAULT));
- assertRatesEqual(expectedDefaultConfig, *configs.getRefreshRate(RefreshRateType::DEFAULT));
- ASSERT_FALSE(configs.getRefreshRate(RefreshRateType::PERFORMANCE));
+ *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT));
+ assertRatesEqual(expectedDefaultConfig, *mConfigs.getRefreshRate(RefreshRateType::DEFAULT));
+ ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE));
// Sanity check that getRefreshRate() does not modify the underlying configs.
- ASSERT_EQ(2, configs.getRefreshRates().size());
+ ASSERT_EQ(2, mConfigs.getRefreshRates().size());
}
TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesPerformanceConfig) {
@@ -132,9 +134,9 @@
auto config90 = HWC2::Display::Config::Builder(*display, CONFIG_ID_90);
config90.setVsyncPeriod(VSYNC_90);
displayConfigs.push_back(config90.build());
- RefreshRateConfigs configs(displayConfigs);
+ mConfigs.populate(displayConfigs);
- const auto& rates = configs.getRefreshRates();
+ const auto& rates = mConfigs.getRefreshRates();
ASSERT_EQ(3, rates.size());
const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING);
const auto& defaultRate = rates.find(RefreshRateType::DEFAULT);
@@ -150,14 +152,14 @@
RefreshRate expectedPerformanceConfig = RefreshRate{CONFIG_ID_90, "90fps", 90};
assertRatesEqual(expectedPerformanceConfig, *performanceRate->second);
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
assertRatesEqual(expectedPowerSavingConfig,
- *configs.getRefreshRate(RefreshRateType::POWER_SAVING));
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::DEFAULT));
- assertRatesEqual(expectedDefaultConfig, *configs.getRefreshRate(RefreshRateType::DEFAULT));
- ASSERT_TRUE(configs.getRefreshRate(RefreshRateType::PERFORMANCE));
+ *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT));
+ assertRatesEqual(expectedDefaultConfig, *mConfigs.getRefreshRate(RefreshRateType::DEFAULT));
+ ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE));
assertRatesEqual(expectedPerformanceConfig,
- *configs.getRefreshRate(RefreshRateType::PERFORMANCE));
+ *mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE));
}
} // namespace
} // namespace scheduler
diff --git a/services/surfaceflinger/tests/unittests/RefreshRateStatsTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateStatsTest.cpp
index 10f5af8..411ec61 100644
--- a/services/surfaceflinger/tests/unittests/RefreshRateStatsTest.cpp
+++ b/services/surfaceflinger/tests/unittests/RefreshRateStatsTest.cpp
@@ -42,11 +42,9 @@
RefreshRateStatsTest();
~RefreshRateStatsTest();
- void init(std::vector<std::shared_ptr<const HWC2::Display::Config>> configs);
-
- std::unique_ptr<RefreshRateStats> mRefreshRateStats;
- std::shared_ptr<android::mock::TimeStats> mTimeStats;
- std::shared_ptr<RefreshRateConfigs> mRefreshRateConfigs;
+ mock::TimeStats mTimeStats;
+ RefreshRateConfigs mRefreshRateConfigs;
+ RefreshRateStats mRefreshRateStats{mRefreshRateConfigs, mTimeStats};
};
RefreshRateStatsTest::RefreshRateStatsTest() {
@@ -61,22 +59,16 @@
ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
}
-void RefreshRateStatsTest::init(std::vector<std::shared_ptr<const HWC2::Display::Config>> configs) {
- mTimeStats = std::make_shared<android::mock::TimeStats>();
- mRefreshRateConfigs = std::make_shared<RefreshRateConfigs>(configs);
- mRefreshRateStats = std::make_unique<RefreshRateStats>(mRefreshRateConfigs, mTimeStats);
-}
-
namespace {
/* ------------------------------------------------------------------------
* Test cases
*/
TEST_F(RefreshRateStatsTest, canCreateAndDestroyTest) {
std::vector<std::shared_ptr<const HWC2::Display::Config>> configs;
- init(configs);
+ mRefreshRateConfigs.populate(configs);
// There is one default config, so the refresh rates should have one item.
- EXPECT_EQ(1, mRefreshRateStats->getTotalTimes().size());
+ EXPECT_EQ(1, mRefreshRateStats.getTotalTimes().size());
}
TEST_F(RefreshRateStatsTest, oneConfigTest) {
@@ -87,12 +79,12 @@
std::vector<std::shared_ptr<const HWC2::Display::Config>> configs;
configs.push_back(config.build());
- init(configs);
+ mRefreshRateConfigs.populate(configs);
- EXPECT_CALL(*mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
- EXPECT_CALL(*mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
+ EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
+ EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
- std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
+ std::unordered_map<std::string, int64_t> times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(2, times.size());
EXPECT_NE(0u, times.count("ScreenOff"));
EXPECT_EQ(1u, times.count("90fps"));
@@ -105,29 +97,29 @@
// Screen is off by default.
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_LT(screenOff, times["ScreenOff"]);
EXPECT_EQ(0, times["90fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_90);
- mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
- screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_90);
+ mRefreshRateStats.setPowerMode(HWC_POWER_MODE_NORMAL);
+ screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(screenOff, times["ScreenOff"]);
EXPECT_LT(ninety, times["90fps"]);
- mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
- ninety = mRefreshRateStats->getTotalTimes()["90fps"];
+ mRefreshRateStats.setPowerMode(HWC_POWER_MODE_DOZE);
+ ninety = mRefreshRateStats.getTotalTimes()["90fps"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_LT(screenOff, times["ScreenOff"]);
EXPECT_EQ(ninety, times["90fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_90);
- screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_90);
+ screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
// Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
// does not update refresh rates that come from the config.
EXPECT_LT(screenOff, times["ScreenOff"]);
@@ -146,13 +138,13 @@
config60.setVsyncPeriod(VSYNC_60);
configs.push_back(config60.build());
- init(configs);
+ mRefreshRateConfigs.populate(configs);
- EXPECT_CALL(*mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
- EXPECT_CALL(*mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
- EXPECT_CALL(*mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
+ EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
+ EXPECT_CALL(mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
+ EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
- std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
+ std::unordered_map<std::string, int64_t> times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(3, times.size());
EXPECT_NE(0u, times.count("ScreenOff"));
EXPECT_EQ(1u, times.count("60fps"));
@@ -168,60 +160,60 @@
// Screen is off by default.
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_LT(screenOff, times["ScreenOff"]);
EXPECT_EQ(sixty, times["60fps"]);
EXPECT_EQ(ninety, times["90fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_90);
- mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
- screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_90);
+ mRefreshRateStats.setPowerMode(HWC_POWER_MODE_NORMAL);
+ screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(screenOff, times["ScreenOff"]);
EXPECT_EQ(sixty, times["60fps"]);
EXPECT_LT(ninety, times["90fps"]);
// When power mode is normal, time for configs updates.
- mRefreshRateStats->setConfigMode(CONFIG_ID_60);
- ninety = mRefreshRateStats->getTotalTimes()["90fps"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_60);
+ ninety = mRefreshRateStats.getTotalTimes()["90fps"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(screenOff, times["ScreenOff"]);
EXPECT_EQ(ninety, times["90fps"]);
EXPECT_LT(sixty, times["60fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_90);
- sixty = mRefreshRateStats->getTotalTimes()["60fps"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_90);
+ sixty = mRefreshRateStats.getTotalTimes()["60fps"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(screenOff, times["ScreenOff"]);
EXPECT_LT(ninety, times["90fps"]);
EXPECT_EQ(sixty, times["60fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_60);
- ninety = mRefreshRateStats->getTotalTimes()["90fps"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_60);
+ ninety = mRefreshRateStats.getTotalTimes()["90fps"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_EQ(screenOff, times["ScreenOff"]);
EXPECT_EQ(ninety, times["90fps"]);
EXPECT_LT(sixty, times["60fps"]);
// Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
// does not update refresh rates that come from the config.
- mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
- mRefreshRateStats->setConfigMode(CONFIG_ID_90);
- sixty = mRefreshRateStats->getTotalTimes()["60fps"];
+ mRefreshRateStats.setPowerMode(HWC_POWER_MODE_DOZE);
+ mRefreshRateStats.setConfigMode(CONFIG_ID_90);
+ sixty = mRefreshRateStats.getTotalTimes()["60fps"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_LT(screenOff, times["ScreenOff"]);
EXPECT_EQ(ninety, times["90fps"]);
EXPECT_EQ(sixty, times["60fps"]);
- mRefreshRateStats->setConfigMode(CONFIG_ID_60);
- screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
+ mRefreshRateStats.setConfigMode(CONFIG_ID_60);
+ screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
std::this_thread::sleep_for(std::chrono::milliseconds(2));
- times = mRefreshRateStats->getTotalTimes();
+ times = mRefreshRateStats.getTotalTimes();
EXPECT_LT(screenOff, times["ScreenOff"]);
EXPECT_EQ(ninety, times["90fps"]);
EXPECT_EQ(sixty, times["60fps"]);
diff --git a/services/vr/virtual_touchpad/Android.bp b/services/vr/virtual_touchpad/Android.bp
index 0263481..131a306 100644
--- a/services/vr/virtual_touchpad/Android.bp
+++ b/services/vr/virtual_touchpad/Android.bp
@@ -62,7 +62,7 @@
service_src = [
"main.cpp",
"VirtualTouchpadService.cpp",
- "aidl/android/dvr/VirtualTouchpadService.aidl",
+ "aidl/android/dvr/IVirtualTouchpadService.aidl",
]
service_static_libs = [
@@ -99,7 +99,7 @@
client_src = [
"VirtualTouchpadClient.cpp",
"DvrVirtualTouchpadClient.cpp",
- "aidl/android/dvr/VirtualTouchpadService.aidl",
+ "aidl/android/dvr/IVirtualTouchpadService.aidl",
]
client_shared_libs = [
diff --git a/services/vr/virtual_touchpad/aidl/android/dvr/VirtualTouchpadService.aidl b/services/vr/virtual_touchpad/aidl/android/dvr/IVirtualTouchpadService.aidl
similarity index 97%
rename from services/vr/virtual_touchpad/aidl/android/dvr/VirtualTouchpadService.aidl
rename to services/vr/virtual_touchpad/aidl/android/dvr/IVirtualTouchpadService.aidl
index 256203c..89aa44a 100644
--- a/services/vr/virtual_touchpad/aidl/android/dvr/VirtualTouchpadService.aidl
+++ b/services/vr/virtual_touchpad/aidl/android/dvr/IVirtualTouchpadService.aidl
@@ -1,7 +1,7 @@
package android.dvr;
/** @hide */
-interface VirtualTouchpadService
+interface IVirtualTouchpadService
{
const String SERVICE_NAME = "virtual_touchpad";