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

Commit 112211ee authored by Trevor Black's avatar Trevor Black Committed by Gerrit Code Review
Browse files

Merge changes from topic "AHB_format_r_16+"

* changes:
  The ahb changes necessary for
  swapchain: Don't call native_window_get_wide_color_support
parents cbb975dc 9cfe1ed5
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -617,15 +617,27 @@ bool AHardwareBuffer_isValidPixelFormat(uint32_t format) {
    static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_8) ==
                          AHARDWAREBUFFER_FORMAT_R8_UNORM,
            "HAL and AHardwareBuffer pixel format don't match");
    static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_16_UINT) ==
                          AHARDWAREBUFFER_FORMAT_R16_UINT,
            "HAL and AHardwareBuffer pixel format don't match");
    static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RG_1616_UINT) ==
                          AHARDWAREBUFFER_FORMAT_R16G16_UINT,
            "HAL and AHardwareBuffer pixel format don't match");
    static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RGBA_10101010) ==
                          AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM,
            "HAL and AHardwareBuffer pixel format don't match");

    switch (format) {
        case AHARDWAREBUFFER_FORMAT_R8_UNORM:
        case AHARDWAREBUFFER_FORMAT_R16_UINT:
        case AHARDWAREBUFFER_FORMAT_R16G16_UINT:
        case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
        case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
        case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
        case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
        case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
        case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
        case AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM:
        case AHARDWAREBUFFER_FORMAT_BLOB:
        case AHARDWAREBUFFER_FORMAT_D16_UNORM:
        case AHARDWAREBUFFER_FORMAT_D24_UNORM:
@@ -677,6 +689,7 @@ uint32_t AHardwareBuffer_bytesPerPixel(uint32_t format) {
          return 1;
      case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
      case AHARDWAREBUFFER_FORMAT_D16_UNORM:
      case AHARDWAREBUFFER_FORMAT_R16_UINT:
          return 2;
      case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
      case AHARDWAREBUFFER_FORMAT_D24_UNORM:
@@ -686,8 +699,10 @@ uint32_t AHardwareBuffer_bytesPerPixel(uint32_t format) {
      case AHARDWAREBUFFER_FORMAT_D32_FLOAT:
      case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
      case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
      case AHARDWAREBUFFER_FORMAT_R16G16_UINT:
          return 4;
      case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
      case AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM:
          return 8;
      default:
          return 0;
+21 −0
Original line number Diff line number Diff line
@@ -173,6 +173,27 @@ enum AHardwareBuffer_Format {
     *   OpenGL ES: GR_GL_R8
     */
    AHARDWAREBUFFER_FORMAT_R8_UNORM                 = 0x38,

    /**
     * Corresponding formats:
     *   Vulkan: VK_FORMAT_R16_UINT
     *   OpenGL ES: GR_GL_R16UI
     */
    AHARDWAREBUFFER_FORMAT_R16_UINT                 = 0x39,

    /**
     * Corresponding formats:
     *   Vulkan: VK_FORMAT_R16G16_UINT
     *   OpenGL ES: GR_GL_RG16UI
     */
    AHARDWAREBUFFER_FORMAT_R16G16_UINT              = 0x3a,

    /**
     * Corresponding formats:
     *   Vulkan: VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
     *   OpenGL ES: N/A
     */
    AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM       = 0x3b,
};

/**
+13 −10
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ enum {
    PIXEL_FORMAT_RGBA_FP16     = HAL_PIXEL_FORMAT_RGBA_FP16,    // 64-bit RGBA
    PIXEL_FORMAT_RGBA_1010102  = HAL_PIXEL_FORMAT_RGBA_1010102, // 32-bit RGBA
    PIXEL_FORMAT_R_8           = 0x38,
    PIXEL_FORMAT_R_16_UINT     = 0x39,
    PIXEL_FORMAT_RG_1616_UINT  = 0x3a,
    PIXEL_FORMAT_RGBA_10101010 = 0x3b,
};

typedef int32_t PixelFormat;
+21 −21
Original line number Diff line number Diff line
@@ -508,6 +508,10 @@ android::PixelFormat GetNativePixelFormat(VkFormat format) {
        case VK_FORMAT_R8_UNORM:
            native_format = android::PIXEL_FORMAT_R_8;
            break;
        // TODO: Do we need to query for VK_EXT_rgba10x6_formats here?
        case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
            native_format = android::PIXEL_FORMAT_RGBA_10101010;
            break;
        default:
            ALOGV("unsupported swapchain format %d", format);
            break;
@@ -754,7 +758,6 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,

    const InstanceData& instance_data = GetData(pdev);

    bool wide_color_support = false;
    uint64_t consumer_usage = 0;
    bool colorspace_ext =
        instance_data.hook_extensions.test(ProcHook::EXT_swapchain_colorspace);
@@ -765,27 +768,15 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
        if (!surfaceless_enabled) {
            return VK_ERROR_SURFACE_LOST_KHR;
        }
        // Support for VK_GOOGLE_surfaceless_query.  The EGL loader
        // unconditionally supports wide color formats, even if they will cause
        // a SurfaceFlinger fallback.  Based on that, wide_color_support will be
        // set to true in this case.
        wide_color_support = true;
        // Support for VK_GOOGLE_surfaceless_query.

        // TODO(b/203826952): research proper value; temporarily use the
        // values seen on Pixel
        consumer_usage = AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY;
    } else {
        Surface& surface = *SurfaceFromHandle(surface_handle);
        int err = native_window_get_wide_color_support(surface.window.get(),
                                                       &wide_color_support);
        if (err) {
            return VK_ERROR_SURFACE_LOST_KHR;
        }
        ALOGV("wide_color_support is: %d", wide_color_support);

        consumer_usage = surface.consumer_usage;
    }
    wide_color_support = wide_color_support && colorspace_ext;

    AHardwareBuffer_Desc desc = {};
    desc.width = 1;
@@ -807,9 +798,6 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
            VK_FORMAT_R8G8B8A8_SRGB, VK_COLOR_SPACE_PASS_THROUGH_EXT});
        all_formats.emplace_back(VkSurfaceFormatKHR{
            VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_BT709_LINEAR_EXT});
    }

    if (wide_color_support) {
        all_formats.emplace_back(VkSurfaceFormatKHR{
            VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
        all_formats.emplace_back(VkSurfaceFormatKHR{
@@ -839,8 +827,6 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
                                   VK_COLOR_SPACE_PASS_THROUGH_EXT});
        }
        if (wide_color_support) {
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
                                   VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT});
@@ -859,8 +845,6 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_A2B10G10R10_UNORM_PACK32,
                                   VK_COLOR_SPACE_PASS_THROUGH_EXT});
        }
        if (wide_color_support) {
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_A2B10G10R10_UNORM_PACK32,
                                   VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
@@ -875,6 +859,22 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
        }
    }

    // TODO query VK_EXT_rgba10x6_formats support
    desc.format = AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM;
    if (AHardwareBuffer_isSupported(&desc)) {
        all_formats.emplace_back(
            VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
                               VK_COLOR_SPACE_SRGB_NONLINEAR_KHR});
        if (colorspace_ext) {
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
                                   VK_COLOR_SPACE_PASS_THROUGH_EXT});
            all_formats.emplace_back(
                VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
                                   VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
        }
    }

    // NOTE: Any new formats that are added must be coordinated across different
    // Android users.  This includes the ANGLE team (a layered implementation of
    // OpenGL-ES).