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

Commit 7671d461 authored by Courtney Goeltzenleuchter's avatar Courtney Goeltzenleuchter
Browse files

Add HDR support to Vulkan

bug: 63710530
Test: adb -d shell am start -n \
	com.drawelements.deqp/android.app.NativeActivity \
	-e cmdLine '"deqp --deqp-case=dEQP-VK.wsi.android.colorspace.* \
	--deqp-log-filename=/sdcard/dEQP-Log.qpa"'
Change-Id: Ia5a5349aed06d875965972a2d809738329196e5a
parent 47f36ab4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -68,10 +68,14 @@ cc_library_shared {
        "vulkan_headers",
    ],
    shared_libs: [
        "android.hardware.configstore@1.0",
        "android.hardware.configstore-utils",
        "libziparchive",
        "libhardware",
        "libsync",
        "libbase",
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "libui",
        "libgraphicsenv",
+13 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@
#include <log/log.h>

#include <android/dlext.h>
#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
#include <configstore/Utils.h>
#include <cutils/properties.h>
#include <graphicsenv/GraphicsEnv.h>
#include <utils/Vector.h>
@@ -36,6 +38,9 @@
#include "driver.h"
#include "stubhal.h"

using namespace android::hardware::configstore;
using namespace android::hardware::configstore::V1_0;

// TODO(b/37049319) Get this from a header once one exists
extern "C" {
android_namespace_t* android_get_exported_namespace(const char*);
@@ -814,6 +819,14 @@ VkResult EnumerateDeviceExtensionProperties(
        VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME,
        VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION});

    bool hdrBoardConfig =
        getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasHDRDisplay>(
            false);
    if (hdrBoardConfig) {
        loader_extensions.push_back({VK_EXT_HDR_METADATA_EXTENSION_NAME,
                                     VK_EXT_HDR_METADATA_SPEC_VERSION});
    }

    VkPhysicalDevicePresentationPropertiesANDROID presentation_properties;
    if (QueryPresentationProperties(physicalDevice, &presentation_properties) &&
        presentation_properties.sharedImage) {
+30 −6
Original line number Diff line number Diff line
@@ -1650,15 +1650,39 @@ VkResult GetSwapchainStatusKHR(
}

VKAPI_ATTR void SetHdrMetadataEXT(
    VkDevice device,
    VkDevice,
    uint32_t swapchainCount,
    const VkSwapchainKHR* pSwapchains,
    const VkHdrMetadataEXT* pHdrMetadataEXTs) {
    // TODO: courtneygo: implement actual function
    (void)device;
    (void)swapchainCount;
    (void)pSwapchains;
    (void)pHdrMetadataEXTs;

    for (uint32_t idx = 0; idx < swapchainCount; idx++) {
        Swapchain* swapchain = SwapchainFromHandle(pSwapchains[idx]);
        if (!swapchain)
            continue;

        if (swapchain->surface.swapchain_handle != pSwapchains[idx]) continue;

        ANativeWindow* window = swapchain->surface.window.get();

        VkHdrMetadataEXT vulkanMetadata = pHdrMetadataEXTs[idx];
        const android_smpte2086_metadata smpteMetdata = {
            {vulkanMetadata.displayPrimaryRed.x,
             vulkanMetadata.displayPrimaryRed.y},
            {vulkanMetadata.displayPrimaryGreen.x,
             vulkanMetadata.displayPrimaryGreen.y},
            {vulkanMetadata.displayPrimaryBlue.x,
             vulkanMetadata.displayPrimaryBlue.y},
            {vulkanMetadata.whitePoint.x, vulkanMetadata.whitePoint.y},
            vulkanMetadata.maxLuminance,
            vulkanMetadata.minLuminance};
        native_window_set_buffers_smpte2086_metadata(window, &smpteMetdata);

        const android_cta861_3_metadata cta8613Metadata = {
            vulkanMetadata.maxContentLightLevel,
            vulkanMetadata.maxFrameAverageLightLevel};
        native_window_set_buffers_cta861_3_metadata(window, &cta8613Metadata);
    }

    return;
}