Skip to content
Snippets Groups Projects
Commit 4a3035ef authored by Alec Mouri's avatar Alec Mouri
Browse files

Add 10101010 support in HWUI.

Prefer it if HWC claims support in OverlayProperties.

Only add support in the vulkan path, because I don't know what GL
incantation maps to VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16

Bug: 284159488
Test: builds, boots
Test: courage
Change-Id: I01e9c2d2d6916b1349d2f7d2662b962c3b879a28
parent 19817c18
No related branches found
No related tags found
No related merge requests found
......@@ -69,19 +69,6 @@ public final class OverlayProperties implements Parcelable {
return sDefaultOverlayProperties;
}
/**
* @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.
......
......@@ -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);
......
......@@ -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;
}
......
......@@ -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;
......
......@@ -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},
......
......@@ -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(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment