diff options
-rw-r--r-- | core/java/android/hardware/OverlayProperties.java | 13 | ||||
-rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 14 | ||||
-rw-r--r-- | libs/hwui/DeviceInfo.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/DeviceInfo.h | 10 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 9 |
6 files changed, 37 insertions, 19 deletions
diff --git a/core/java/android/hardware/OverlayProperties.java b/core/java/android/hardware/OverlayProperties.java index 88089eed50f4..4a4d451eb2f6 100644 --- a/core/java/android/hardware/OverlayProperties.java +++ b/core/java/android/hardware/OverlayProperties.java @@ -70,19 +70,6 @@ public final class OverlayProperties implements Parcelable { } /** - * @return True if the device can support fp16, false otherwise. - * TODO: Move this to isCombinationSupported once the flag flips - * @hide - */ - public boolean isFp16SupportedForHdr() { - if (mNativeObject == 0) { - return false; - } - return nIsCombinationSupported( - mNativeObject, DataSpace.DATASPACE_SCRGB, HardwareBuffer.RGBA_FP16); - } - - /** * Indicates that hardware composition of a buffer encoded with the provided {@link DataSpace} * and {@link HardwareBuffer.Format} is supported on the device. * diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index 20e393eaee6d..940cd93c53f2 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -25,6 +25,8 @@ import android.app.ActivityManager; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; +import android.hardware.DataSpace; +import android.hardware.HardwareBuffer; import android.hardware.OverlayProperties; import android.hardware.display.DisplayManager; import android.os.IBinder; @@ -1417,7 +1419,14 @@ public class HardwareRenderer { nInitDisplayInfo(largestWidth, largestHeight, defaultDisplay.getRefreshRate(), wideColorDataspace, defaultDisplay.getAppVsyncOffsetNanos(), defaultDisplay.getPresentationDeadlineNanos(), - overlayProperties.isFp16SupportedForHdr(), + overlayProperties.isCombinationSupported( + DataSpace.DATASPACE_SCRGB, HardwareBuffer.RGBA_FP16), + overlayProperties.isCombinationSupported( + DataSpace.pack( + DataSpace.STANDARD_DCI_P3, + DataSpace.TRANSFER_SRGB, + DataSpace.RANGE_EXTENDED), + HardwareBuffer.RGBA_10101010), overlayProperties.isMixedColorSpacesSupported()); mDisplayInitialized = true; @@ -1603,7 +1612,8 @@ public class HardwareRenderer { private static native void nInitDisplayInfo(int width, int height, float refreshRate, int wideColorDataspace, long appVsyncOffsetNanos, long presentationDeadlineNanos, - boolean supportsFp16ForHdr, boolean nInitDisplayInfo); + boolean supportsFp16ForHdr, boolean isRgba10101010SupportedForHdr, + boolean nSupportMixedColorSpaces); private static native void nSetDrawingEnabled(boolean drawingEnabled); diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp index 32bc122fdc58..af7a49653829 100644 --- a/libs/hwui/DeviceInfo.cpp +++ b/libs/hwui/DeviceInfo.cpp @@ -108,6 +108,10 @@ void DeviceInfo::setSupportFp16ForHdr(bool supportFp16ForHdr) { get()->mSupportFp16ForHdr = supportFp16ForHdr; } +void DeviceInfo::setSupportRgba10101010ForHdr(bool supportRgba10101010ForHdr) { + get()->mSupportRgba10101010ForHdr = supportRgba10101010ForHdr; +} + void DeviceInfo::setSupportMixedColorSpaces(bool supportMixedColorSpaces) { get()->mSupportMixedColorSpaces = supportMixedColorSpaces; } diff --git a/libs/hwui/DeviceInfo.h b/libs/hwui/DeviceInfo.h index a5a841e07d7a..fb58a69747b3 100644 --- a/libs/hwui/DeviceInfo.h +++ b/libs/hwui/DeviceInfo.h @@ -69,6 +69,15 @@ public: return get()->mSupportFp16ForHdr; }; + static void setSupportRgba10101010ForHdr(bool supportRgba10101010ForHdr); + static bool isSupportRgba10101010ForHdr() { + if (!Properties::hdr10bitPlus) { + return false; + } + + return get()->mSupportRgba10101010ForHdr; + }; + static void setSupportMixedColorSpaces(bool supportMixedColorSpaces); static bool isSupportMixedColorSpaces() { return get()->mSupportMixedColorSpaces; }; @@ -102,6 +111,7 @@ private: int mMaxTextureSize; sk_sp<SkColorSpace> mWideColorSpace = SkColorSpace::MakeSRGB(); bool mSupportFp16ForHdr = false; + bool mSupportRgba10101010ForHdr = false; bool mSupportMixedColorSpaces = false; SkColorType mWideColorType = SkColorType::kN32_SkColorType; int mDisplaysSize = 0; diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index d15b1680de94..d9e2c8c25327 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -860,7 +860,8 @@ static void android_view_ThreadedRenderer_setDisplayDensityDpi(JNIEnv*, jclass, static void android_view_ThreadedRenderer_initDisplayInfo( JNIEnv* env, jclass, jint physicalWidth, jint physicalHeight, jfloat refreshRate, jint wideColorDataspace, jlong appVsyncOffsetNanos, jlong presentationDeadlineNanos, - jboolean supportFp16ForHdr, jboolean supportMixedColorSpaces) { + jboolean supportFp16ForHdr, jboolean supportRgba10101010ForHdr, + jboolean supportMixedColorSpaces) { DeviceInfo::setWidth(physicalWidth); DeviceInfo::setHeight(physicalHeight); DeviceInfo::setRefreshRate(refreshRate); @@ -868,6 +869,7 @@ static void android_view_ThreadedRenderer_initDisplayInfo( DeviceInfo::setAppVsyncOffsetNanos(appVsyncOffsetNanos); DeviceInfo::setPresentationDeadlineNanos(presentationDeadlineNanos); DeviceInfo::setSupportFp16ForHdr(supportFp16ForHdr); + DeviceInfo::setSupportRgba10101010ForHdr(supportRgba10101010ForHdr); DeviceInfo::setSupportMixedColorSpaces(supportMixedColorSpaces); } @@ -1020,7 +1022,7 @@ static const JNINativeMethod gMethods[] = { {"nSetForceDark", "(JI)V", (void*)android_view_ThreadedRenderer_setForceDark}, {"nSetDisplayDensityDpi", "(I)V", (void*)android_view_ThreadedRenderer_setDisplayDensityDpi}, - {"nInitDisplayInfo", "(IIFIJJZZ)V", (void*)android_view_ThreadedRenderer_initDisplayInfo}, + {"nInitDisplayInfo", "(IIFIJJZZZ)V", (void*)android_view_ThreadedRenderer_initDisplayInfo}, {"preload", "()V", (void*)android_view_ThreadedRenderer_preload}, {"isWebViewOverlaysEnabled", "()Z", (void*)android_view_ThreadedRenderer_isWebViewOverlaysEnabled}, diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 326b6ed77fe0..99469d1e3628 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -650,7 +650,11 @@ void SkiaPipeline::setSurfaceColorProperties(ColorMode colorMode) { mSurfaceColorSpace = DeviceInfo::get()->getWideColorSpace(); break; case ColorMode::Hdr: - if (DeviceInfo::get()->isSupportFp16ForHdr()) { + if (DeviceInfo::get()->isSupportRgba10101010ForHdr()) { + mSurfaceColorType = SkColorType::kRGBA_10x6_SkColorType; + mSurfaceColorSpace = SkColorSpace::MakeRGB( + GetExtendedTransferFunction(mTargetSdrHdrRatio), SkNamedGamut::kDisplayP3); + } else if (DeviceInfo::get()->isSupportFp16ForHdr()) { mSurfaceColorType = SkColorType::kRGBA_F16_SkColorType; mSurfaceColorSpace = SkColorSpace::MakeSRGB(); } else { @@ -675,7 +679,8 @@ void SkiaPipeline::setTargetSdrHdrRatio(float ratio) { if (mColorMode == ColorMode::Hdr || mColorMode == ColorMode::Hdr10) { mTargetSdrHdrRatio = ratio; - if (mColorMode == ColorMode::Hdr && DeviceInfo::get()->isSupportFp16ForHdr()) { + if (mColorMode == ColorMode::Hdr && DeviceInfo::get()->isSupportFp16ForHdr() && + !DeviceInfo::get()->isSupportRgba10101010ForHdr()) { mSurfaceColorSpace = SkColorSpace::MakeSRGB(); } else { mSurfaceColorSpace = SkColorSpace::MakeRGB( |