Merge "Respect HDR/HDR10 colormodes in HWUI Vulkan backend" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ed941a71b3
@@ -194,24 +194,25 @@ bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode
|
|||||||
outWindowInfo->bufferCount = static_cast<uint32_t>(query_value);
|
outWindowInfo->bufferCount = static_cast<uint32_t>(query_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
outWindowInfo->dataspace = HAL_DATASPACE_V0_SRGB;
|
|
||||||
if (colorMode == ColorMode::WideColorGamut) {
|
|
||||||
skcms_Matrix3x3 surfaceGamut;
|
|
||||||
LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&surfaceGamut),
|
|
||||||
"Could not get gamut matrix from color space");
|
|
||||||
if (memcmp(&surfaceGamut, &SkNamedGamut::kSRGB, sizeof(surfaceGamut)) == 0) {
|
|
||||||
outWindowInfo->dataspace = HAL_DATASPACE_V0_SCRGB;
|
|
||||||
} else if (memcmp(&surfaceGamut, &SkNamedGamut::kDisplayP3, sizeof(surfaceGamut)) == 0) {
|
|
||||||
outWindowInfo->dataspace = HAL_DATASPACE_DISPLAY_P3;
|
|
||||||
} else {
|
|
||||||
LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
outWindowInfo->bufferFormat = ColorTypeToBufferFormat(colorType);
|
outWindowInfo->bufferFormat = ColorTypeToBufferFormat(colorType);
|
||||||
VkFormat vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM;
|
outWindowInfo->colorspace = colorSpace;
|
||||||
if (outWindowInfo->bufferFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) {
|
outWindowInfo->dataspace = ColorSpaceToADataSpace(colorSpace.get(), colorType);
|
||||||
vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
|
LOG_ALWAYS_FATAL_IF(outWindowInfo->dataspace == HAL_DATASPACE_UNKNOWN,
|
||||||
|
"Unsupported colorspace");
|
||||||
|
|
||||||
|
VkFormat vkPixelFormat;
|
||||||
|
switch (colorType) {
|
||||||
|
case kRGBA_8888_SkColorType:
|
||||||
|
vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
break;
|
||||||
|
case kRGBA_F16_SkColorType:
|
||||||
|
vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
|
||||||
|
break;
|
||||||
|
case kRGBA_1010102_SkColorType:
|
||||||
|
vkPixelFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_ALWAYS_FATAL("Unsupported colorType: %d", (int)colorType);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_ALWAYS_FATAL_IF(nullptr == vkManager.mGetPhysicalDeviceImageFormatProperties2,
|
LOG_ALWAYS_FATAL_IF(nullptr == vkManager.mGetPhysicalDeviceImageFormatProperties2,
|
||||||
@@ -425,7 +426,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() {
|
|||||||
if (bufferInfo->skSurface.get() == nullptr) {
|
if (bufferInfo->skSurface.get() == nullptr) {
|
||||||
bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer(
|
bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer(
|
||||||
mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()),
|
mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()),
|
||||||
kTopLeft_GrSurfaceOrigin, DataSpaceToColorSpace(mWindowInfo.dataspace), nullptr);
|
kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr);
|
||||||
if (bufferInfo->skSurface.get() == nullptr) {
|
if (bufferInfo->skSurface.get() == nullptr) {
|
||||||
ALOGE("SkSurface::MakeFromAHardwareBuffer failed");
|
ALOGE("SkSurface::MakeFromAHardwareBuffer failed");
|
||||||
mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
|
mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ private:
|
|||||||
SkISize size;
|
SkISize size;
|
||||||
uint32_t bufferFormat;
|
uint32_t bufferFormat;
|
||||||
android_dataspace dataspace;
|
android_dataspace dataspace;
|
||||||
|
sk_sp<SkColorSpace> colorspace;
|
||||||
int transform;
|
int transform;
|
||||||
size_t bufferCount;
|
size_t bufferCount;
|
||||||
uint64_t windowUsageFlags;
|
uint64_t windowUsageFlags;
|
||||||
|
|||||||
@@ -148,7 +148,19 @@ android_dataspace ColorSpaceToADataSpace(SkColorSpace* colorSpace, SkColorType c
|
|||||||
}
|
}
|
||||||
|
|
||||||
skcms_TransferFunction fn;
|
skcms_TransferFunction fn;
|
||||||
LOG_ALWAYS_FATAL_IF(!colorSpace->isNumericalTransferFn(&fn));
|
if (!colorSpace->isNumericalTransferFn(&fn)) {
|
||||||
|
// pq with the default white point
|
||||||
|
auto rec2020PQ = SkColorSpace::MakeRGB(GetPQSkTransferFunction(), SkNamedGamut::kRec2020);
|
||||||
|
if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) {
|
||||||
|
return HAL_DATASPACE_BT2020_PQ;
|
||||||
|
}
|
||||||
|
// standard PQ
|
||||||
|
rec2020PQ = SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, SkNamedGamut::kRec2020);
|
||||||
|
if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) {
|
||||||
|
return HAL_DATASPACE_BT2020_PQ;
|
||||||
|
}
|
||||||
|
LOG_ALWAYS_FATAL("Only select non-numerical transfer functions are supported");
|
||||||
|
}
|
||||||
|
|
||||||
skcms_Matrix3x3 gamut;
|
skcms_Matrix3x3 gamut;
|
||||||
LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&gamut));
|
LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&gamut));
|
||||||
|
|||||||
Reference in New Issue
Block a user