Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed941a71 authored by Derek Sollenberger's avatar Derek Sollenberger Committed by Android (Google) Code Review
Browse files

Merge "Respect HDR/HDR10 colormodes in HWUI Vulkan backend" into sc-dev

parents e670863e 89f170c5
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -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) {
    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);
+1 −0
Original line number Diff line number Diff line
@@ -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;
+13 −1
Original line number Diff line number Diff line
@@ -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));