summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2020-04-06 13:15:28 -0700
committer Alec Mouri <alecmouri@google.com> 2020-04-15 14:55:59 -0700
commitd5fa1dcff518772b0f72d5a8141bc8a58ff01a0c (patch)
tree24cb179c6ab1872c0e342dd45fde1f81e4ba4069
parent392bbe14777a37c463778068ade95f07a9222a47 (diff)
Plumb display density to HWUI through ActivityThread.
Whenever an activity's configuration is updated, then tell HardwareRenderer about it. That way, visualizating frame info does not need to learn the display density from SurfaceFlinger, which reduces the native-side api surface for displays. For now, this method is kept hidden and will be stabilized when HardwareRenderer's apis are stabilized for Mainline inclusion. Bug: 146387012 Test: boots, builds Test: jank visualizer Change-Id: I51d2964bb78882516ebdff05b80819814894bdce
-rw-r--r--core/java/android/app/ActivityThread.java1
-rw-r--r--graphics/java/android/graphics/HardwareRenderer.java18
-rw-r--r--libs/hwui/DeviceInfo.cpp3
-rw-r--r--libs/hwui/DeviceInfo.h11
-rw-r--r--libs/hwui/jni/android_graphics_HardwareRenderer.cpp8
5 files changed, 38 insertions, 3 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index ab94e2d173e6..f2ced2858a99 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -5701,6 +5701,7 @@ public final class ActivityThread extends ClientTransactionHandler {
configDiff = mConfiguration.updateFrom(config);
config = applyCompatConfiguration(mCurDefaultDisplayDpi);
+ HardwareRenderer.sendDeviceConfigurationForDebugging(config);
if ((systemTheme.getChangingConfigurations() & configDiff) != 0) {
systemTheme.rebase();
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index d08bfcf45a5c..3ddbf100ded4 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
+import android.content.res.Configuration;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -143,6 +144,8 @@ public class HardwareRenderer {
private static final String CACHE_PATH_SHADERS = "com.android.opengl.shaders_cache";
private static final String CACHE_PATH_SKIASHADERS = "com.android.skia.shaders_cache";
+ private static int sDensityDpi = 0;
+
private final long mNativeProxy;
/** @hide */
protected RenderNode mRootNode;
@@ -907,6 +910,19 @@ public class HardwareRenderer {
}
/**
+ * Sends device configuration changes to the render thread, for rendering profiling views.
+ *
+ * @hide
+ */
+ public static void sendDeviceConfigurationForDebugging(Configuration config) {
+ if (config.densityDpi != Configuration.DENSITY_DPI_UNDEFINED
+ && config.densityDpi != sDensityDpi) {
+ sDensityDpi = config.densityDpi;
+ nSetDisplayDensityDpi(config.densityDpi);
+ }
+ }
+
+ /**
* If set extra graphics debugging abilities will be enabled such as dumping skp
*
* @hide
@@ -1189,4 +1205,6 @@ public class HardwareRenderer {
private static native void nAllocateBuffers(long nativeProxy);
private static native void nSetForceDark(long nativeProxy, boolean enabled);
+
+ private static native void nSetDisplayDensityDpi(int densityDpi);
}
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index c24224cbbd67..1c947a70f32f 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -113,11 +113,12 @@ void DeviceInfo::updateDisplayInfo() {
mWidth = ADisplayConfig_getWidth(mCurrentConfig);
mHeight = ADisplayConfig_getHeight(mCurrentConfig);
- mDensity = ADisplayConfig_getDensity(mCurrentConfig);
mVsyncPeriod = static_cast<int64_t>(1000000000 / ADisplayConfig_getFps(mCurrentConfig));
mCompositorOffset = ADisplayConfig_getCompositorOffsetNanos(mCurrentConfig);
mAppOffset = ADisplayConfig_getAppVsyncOffsetNanos(mCurrentConfig);
}
+std::atomic<float> DeviceInfo::sDensity = 2.0;
+
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/DeviceInfo.h b/libs/hwui/DeviceInfo.h
index 16a22f4706f5..bcc930107a8b 100644
--- a/libs/hwui/DeviceInfo.h
+++ b/libs/hwui/DeviceInfo.h
@@ -36,10 +36,13 @@ public:
static float getMaxRefreshRate() { return get()->mMaxRefreshRate; }
static int32_t getWidth() { return get()->mWidth; }
static int32_t getHeight() { return get()->mHeight; }
- static float getDensity() { return get()->mDensity; }
+ // Gets the density in density-independent pixels
+ static float getDensity() { return sDensity.load(); }
static int64_t getVsyncPeriod() { return get()->mVsyncPeriod; }
static int64_t getCompositorOffset() { return get()->mCompositorOffset; }
static int64_t getAppOffset() { return get()->mAppOffset; }
+ // Sets the density in density-independent pixels
+ static void setDensity(float density) { sDensity.store(density); }
// this value is only valid after the GPU has been initialized and there is a valid graphics
// context or if you are using the HWUI_NULL_GPU
@@ -68,10 +71,14 @@ private:
float mMaxRefreshRate = 60.0;
int32_t mWidth = 1080;
int32_t mHeight = 1920;
- float mDensity = 2.0;
int64_t mVsyncPeriod = 16666666;
int64_t mCompositorOffset = 0;
int64_t mAppOffset = 0;
+
+ // Density is not retrieved from the ADisplay apis, so this may potentially
+ // be called on multiple threads.
+ // Unit is density-independent pixels
+ static std::atomic<float> sDensity;
};
} /* namespace uirenderer */
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
index 49c7fcd468e1..4f8efa00a1ad 100644
--- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
@@ -593,6 +593,13 @@ static void android_view_ThreadedRenderer_preload(JNIEnv*, jclass) {
RenderProxy::preload();
}
+// Plumbs the display density down to DeviceInfo.
+static void android_view_ThreadedRenderer_setDisplayDensityDpi(JNIEnv*, jclass, jint densityDpi) {
+ // Convert from dpi to density-independent pixels.
+ const float density = densityDpi / 160.0;
+ DeviceInfo::setDensity(density);
+}
+
// ----------------------------------------------------------------------------
// HardwareRendererObserver
// ----------------------------------------------------------------------------
@@ -697,6 +704,7 @@ static const JNINativeMethod gMethods[] = {
{ "nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority },
{ "nAllocateBuffers", "(J)V", (void*)android_view_ThreadedRenderer_allocateBuffers },
{ "nSetForceDark", "(JZ)V", (void*)android_view_ThreadedRenderer_setForceDark },
+ { "nSetDisplayDensityDpi", "(I)V", (void*)android_view_ThreadedRenderer_setDisplayDensityDpi },
{ "preload", "()V", (void*)android_view_ThreadedRenderer_preload },
};