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

Commit 8eb16576 authored by Sally Qi's avatar Sally Qi
Browse files

Fix bt2020 linear ext mapping issue in EGL and Vulkan.

 - EGL_EXT_BT2020_LINEAR should be mapped to extend bt2020 linear if
   output format is FP16.

Bug: 261485283
Test: builds
Change-Id: Ifd68cc10afc0b5b38b15af2a938d02bb3bcd3764
Merged-In: Ifd68cc10afc0b5b38b15af2a938d02bb3bcd3764
(cherry picked from commit aa238976)
parent 32829c7a
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include "egl_trace.h"

using namespace android;
using PixelFormat = aidl::android::hardware::graphics::common::PixelFormat;

// ----------------------------------------------------------------------------

@@ -406,7 +407,7 @@ EGLBoolean eglGetConfigAttribImpl(EGLDisplay dpy, EGLConfig config, EGLint attri
// ----------------------------------------------------------------------------

// Translates EGL color spaces to Android data spaces.
static android_dataspace dataSpaceFromEGLColorSpace(EGLint colorspace) {
static android_dataspace dataSpaceFromEGLColorSpace(EGLint colorspace, PixelFormat pixelFormat) {
    if (colorspace == EGL_GL_COLORSPACE_LINEAR_KHR) {
        return HAL_DATASPACE_UNKNOWN;
    } else if (colorspace == EGL_GL_COLORSPACE_SRGB_KHR) {
@@ -424,7 +425,13 @@ static android_dataspace dataSpaceFromEGLColorSpace(EGLint colorspace) {
    } else if (colorspace == EGL_GL_COLORSPACE_BT2020_HLG_EXT) {
        return static_cast<android_dataspace>(HAL_DATASPACE_BT2020_HLG);
    } else if (colorspace == EGL_GL_COLORSPACE_BT2020_LINEAR_EXT) {
        if (pixelFormat == PixelFormat::RGBA_FP16) {
            return static_cast<android_dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
                                                  HAL_DATASPACE_TRANSFER_LINEAR |
                                                  HAL_DATASPACE_RANGE_EXTENDED);
        } else {
            return HAL_DATASPACE_BT2020_LINEAR;
        }
    } else if (colorspace == EGL_GL_COLORSPACE_BT2020_PQ_EXT) {
        return HAL_DATASPACE_BT2020_PQ;
    }
@@ -573,8 +580,6 @@ void convertAttribs(const EGLAttrib* attribList, std::vector<EGLint>& newList) {
    newList.push_back(EGL_NONE);
}

using PixelFormat = aidl::android::hardware::graphics::common::PixelFormat;

// Gets the native pixel format corrsponding to the passed EGLConfig.
void getNativePixelFormat(EGLDisplay dpy, egl_connection_t* cnx, EGLConfig config,
                          PixelFormat* format) {
@@ -714,7 +719,7 @@ EGLSurface eglCreateWindowSurfaceTmpl(egl_display_t* dp, egl_connection_t* cnx,
            return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
        }

        android_dataspace dataSpace = dataSpaceFromEGLColorSpace(colorSpace);
        android_dataspace dataSpace = dataSpaceFromEGLColorSpace(colorSpace, format);
        // Set dataSpace even if it could be HAL_DATASPACE_UNKNOWN.
        // HAL_DATASPACE_UNKNOWN is the default value, but it may have changed
        // at this point.
+12 −6
Original line number Diff line number Diff line
@@ -532,7 +532,8 @@ android::PixelFormat GetNativePixelFormat(VkFormat format) {
    return native_format;
}

android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace) {
android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace,
                                     android::PixelFormat pixelFormat) {
    switch (colorspace) {
        case VK_COLOR_SPACE_SRGB_NONLINEAR_KHR:
            return HAL_DATASPACE_V0_SRGB;
@@ -551,7 +552,14 @@ android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace) {
        case VK_COLOR_SPACE_BT709_NONLINEAR_EXT:
            return HAL_DATASPACE_V0_SRGB;
        case VK_COLOR_SPACE_BT2020_LINEAR_EXT:
            if (pixelFormat == HAL_PIXEL_FORMAT_RGBA_FP16) {
                return static_cast<android_dataspace>(
                    HAL_DATASPACE_STANDARD_BT2020 |
                    HAL_DATASPACE_TRANSFER_LINEAR |
                    HAL_DATASPACE_RANGE_EXTENDED);
            } else {
                return HAL_DATASPACE_BT2020_LINEAR;
            }
        case VK_COLOR_SPACE_HDR10_ST2084_EXT:
            return static_cast<android_dataspace>(
                HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_ST2084 |
@@ -561,9 +569,7 @@ android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace) {
                HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_ST2084 |
                HAL_DATASPACE_RANGE_FULL);
        case VK_COLOR_SPACE_HDR10_HLG_EXT:
            return static_cast<android_dataspace>(
                HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_HLG |
                HAL_DATASPACE_RANGE_FULL);
            return static_cast<android_dataspace>(HAL_DATASPACE_BT2020_HLG);
        case VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT:
            return static_cast<android_dataspace>(
                HAL_DATASPACE_STANDARD_ADOBE_RGB |
@@ -1364,7 +1370,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
    android::PixelFormat native_pixel_format =
        GetNativePixelFormat(create_info->imageFormat);
    android_dataspace native_dataspace =
        GetNativeDataspace(create_info->imageColorSpace);
        GetNativeDataspace(create_info->imageColorSpace, native_pixel_format);
    if (native_dataspace == HAL_DATASPACE_UNKNOWN) {
        ALOGE(
            "CreateSwapchainKHR(VkSwapchainCreateInfoKHR.imageColorSpace = %d) "