diff options
| -rw-r--r-- | libs/nativedisplay/ADisplay.cpp | 40 | ||||
| -rw-r--r-- | libs/nativedisplay/Android.bp | 1 | ||||
| -rw-r--r-- | libs/nativedisplay/include/apex/display.h | 8 |
3 files changed, 48 insertions, 1 deletions
diff --git a/libs/nativedisplay/ADisplay.cpp b/libs/nativedisplay/ADisplay.cpp index 666563520e..6566538eff 100644 --- a/libs/nativedisplay/ADisplay.cpp +++ b/libs/nativedisplay/ADisplay.cpp @@ -18,6 +18,7 @@ #include <gui/SurfaceComposerClient.h> #include <ui/DisplayInfo.h> #include <ui/GraphicTypes.h> +#include <ui/PixelFormat.h> #include <algorithm> #include <optional> @@ -82,6 +83,16 @@ struct DisplayImpl { ADisplayType type; /** + * The preferred WCG dataspace + */ + ADataSpace wcgDataspace; + + /** + * The preferred WCG pixel format + */ + AHardwareBuffer_Format wcgPixelFormat; + + /** * Number of supported configs */ size_t numConfigs; @@ -151,6 +162,17 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { const std::optional<PhysicalDisplayId> internalId = SurfaceComposerClient::getInternalDisplayId(); + ui::Dataspace defaultDataspace; + ui::PixelFormat defaultPixelFormat; + ui::Dataspace wcgDataspace; + ui::PixelFormat wcgPixelFormat; + + const status_t status = + SurfaceComposerClient::getCompositionPreference(&defaultDataspace, &defaultPixelFormat, + &wcgDataspace, &wcgPixelFormat); + if (status != NO_ERROR) { + return status; + } // Here we allocate all our required memory in one block. The layout is as // follows: @@ -176,7 +198,12 @@ int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) { const std::vector<DisplayConfigImpl>& configs = configsPerDisplay[i]; memcpy(configData, configs.data(), sizeof(DisplayConfigImpl) * configs.size()); - displayData[i] = DisplayImpl{id, type, configs.size(), configData}; + displayData[i] = DisplayImpl{id, + type, + static_cast<ADataSpace>(wcgDataspace), + static_cast<AHardwareBuffer_Format>(wcgPixelFormat), + configs.size(), + configData}; impls[i] = displayData + i; // Advance the configData pointer so that future configs are written to // the correct display. @@ -210,6 +237,17 @@ ADisplayType ADisplay_getDisplayType(ADisplay* display) { return reinterpret_cast<DisplayImpl*>(display)->type; } +void ADisplay_getPreferredWideColorFormat(ADisplay* display, ADataSpace* outDataspace, + AHardwareBuffer_Format* outPixelFormat) { + CHECK_NOT_NULL(display); + CHECK_NOT_NULL(outDataspace); + CHECK_NOT_NULL(outPixelFormat); + + DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display); + *outDataspace = impl->wcgDataspace; + *outPixelFormat = impl->wcgPixelFormat; +} + int ADisplay_getCurrentConfig(ADisplay* display, ADisplayConfig** outConfig) { CHECK_NOT_NULL(display); diff --git a/libs/nativedisplay/Android.bp b/libs/nativedisplay/Android.bp index 45b935ac08..a9b8d66933 100644 --- a/libs/nativedisplay/Android.bp +++ b/libs/nativedisplay/Android.bp @@ -49,6 +49,7 @@ cc_library { "libandroidfw", "libgui", "liblog", + "libnativewindow", "libui", "libutils", ], diff --git a/libs/nativedisplay/include/apex/display.h b/libs/nativedisplay/include/apex/display.h index 7af452a782..9be401e4a8 100644 --- a/libs/nativedisplay/include/apex/display.h +++ b/libs/nativedisplay/include/apex/display.h @@ -16,6 +16,8 @@ #pragma once +#include <android/data_space.h> +#include <android/hardware_buffer.h> #include <inttypes.h> __BEGIN_DECLS @@ -72,6 +74,12 @@ float ADisplay_getMaxSupportedFps(ADisplay* display); ADisplayType ADisplay_getDisplayType(ADisplay* display); /** + * Queries the display's preferred WCG format + */ +void ADisplay_getPreferredWideColorFormat(ADisplay* display, ADataSpace* outDataspace, + AHardwareBuffer_Format* outPixelFormat); + +/** * Gets the current display configuration for the given display. * * Memory is *not* allocated for the caller. As such, the returned output |