diff options
author | 2021-04-01 16:05:54 -0400 | |
---|---|---|
committer | 2021-04-01 16:37:16 -0400 | |
commit | 89f170c5addac0cc09434486e8e66d7d97ba8611 (patch) | |
tree | 7dc12528b201ab08f36c6649af1e68df9e663c58 | |
parent | 59634a7fc7a8b0984ab040c87fb47318fa1589df (diff) |
Respect HDR/HDR10 colormodes in HWUI Vulkan backend
Test: SilkFX
Bug: 184283931
Change-Id: I724eb683a03f7ada4561c245aca5fffe7b6a5ac9
-rw-r--r-- | libs/hwui/renderthread/VulkanSurface.cpp | 37 | ||||
-rw-r--r-- | libs/hwui/renderthread/VulkanSurface.h | 1 | ||||
-rw-r--r-- | libs/hwui/utils/Color.cpp | 14 |
3 files changed, 33 insertions, 19 deletions
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index acf4931d6144..474d2ccf8600 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -194,24 +194,25 @@ bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode 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); - VkFormat vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM; - if (outWindowInfo->bufferFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) { - vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT; + outWindowInfo->colorspace = colorSpace; + outWindowInfo->dataspace = ColorSpaceToADataSpace(colorSpace.get(), colorType); + 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, @@ -425,7 +426,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { if (bufferInfo->skSurface.get() == nullptr) { bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer( mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()), - kTopLeft_GrSurfaceOrigin, DataSpaceToColorSpace(mWindowInfo.dataspace), nullptr); + kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr); if (bufferInfo->skSurface.get() == nullptr) { ALOGE("SkSurface::MakeFromAHardwareBuffer failed"); mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h index 409921bdfdd7..7c2554583961 100644 --- a/libs/hwui/renderthread/VulkanSurface.h +++ b/libs/hwui/renderthread/VulkanSurface.h @@ -91,6 +91,7 @@ private: SkISize size; uint32_t bufferFormat; android_dataspace dataspace; + sk_sp<SkColorSpace> colorspace; int transform; size_t bufferCount; uint64_t windowUsageFlags; diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index 87512f0354c8..5d9f2297c15a 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -148,7 +148,19 @@ android_dataspace ColorSpaceToADataSpace(SkColorSpace* colorSpace, SkColorType c } 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; LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&gamut)); |