diff options
| author | 2019-02-18 15:51:53 +0900 | |
|---|---|---|
| committer | 2019-02-22 15:41:28 +0900 | |
| commit | 85131bd27e68e46e1f1b8af1d48c845044138684 (patch) | |
| tree | ed3828bdf619e6f893a28b2bb1779f553ed9ea1e | |
| parent | f8902d28ecb8ff15959db37541409e10edf39a7a (diff) | |
add display_primary* to sysprop
The display_primary* properties is added for getDisplayNativePrimaries
function. Since this function is changed from configstore to sysrpop for
removing configstore 1.2
Bug: 124531214
Test: m -j && boot test && atest libsurfaceflinger_unittest
Change-Id: Ibe22aadab1095e624dc498a743f343f301dc4ea6
7 files changed, 83 insertions, 71 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 03c144b3a3..1466785ae0 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -203,19 +203,6 @@ const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER" const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER"); const String16 sDump("android.permission.DUMP"); -constexpr float kSrgbRedX = 0.4123f; -constexpr float kSrgbRedY = 0.2126f; -constexpr float kSrgbRedZ = 0.0193f; -constexpr float kSrgbGreenX = 0.3576f; -constexpr float kSrgbGreenY = 0.7152f; -constexpr float kSrgbGreenZ = 0.1192f; -constexpr float kSrgbBlueX = 0.1805f; -constexpr float kSrgbBlueY = 0.0722f; -constexpr float kSrgbBlueZ = 0.9506f; -constexpr float kSrgbWhiteX = 0.9505f; -constexpr float kSrgbWhiteY = 1.0000f; -constexpr float kSrgbWhiteZ = 1.0891f; - constexpr float kDefaultRefreshRate = 60.f; constexpr float kPerformanceRefreshRate = 90.f; @@ -351,15 +338,7 @@ SurfaceFlinger::SurfaceFlinger(surfaceflinger::Factory& factory) } ALOGV("Primary Display Orientation is set to %2d.", SurfaceFlinger::primaryDisplayOrientation); - auto surfaceFlingerConfigsServiceV1_2 = V1_2::ISurfaceFlingerConfigs::getService(); - if (surfaceFlingerConfigsServiceV1_2) { - surfaceFlingerConfigsServiceV1_2->getDisplayNativePrimaries( - [&](auto tmpPrimaries) { - memcpy(&mInternalDisplayPrimaries, &tmpPrimaries, sizeof(ui::DisplayPrimaries)); - }); - } else { - initDefaultDisplayNativePrimaries(); - } + mInternalDisplayPrimaries = sysprop::getDisplayNativePrimaries(); // debugging stuff... char value[PROPERTY_VALUE_MAX]; @@ -3189,21 +3168,6 @@ void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Re } } -void SurfaceFlinger::initDefaultDisplayNativePrimaries() { - mInternalDisplayPrimaries.red.X = kSrgbRedX; - mInternalDisplayPrimaries.red.Y = kSrgbRedY; - mInternalDisplayPrimaries.red.Z = kSrgbRedZ; - mInternalDisplayPrimaries.green.X = kSrgbGreenX; - mInternalDisplayPrimaries.green.Y = kSrgbGreenY; - mInternalDisplayPrimaries.green.Z = kSrgbGreenZ; - mInternalDisplayPrimaries.blue.X = kSrgbBlueX; - mInternalDisplayPrimaries.blue.Y = kSrgbBlueY; - mInternalDisplayPrimaries.blue.Z = kSrgbBlueZ; - mInternalDisplayPrimaries.white.X = kSrgbWhiteX; - mInternalDisplayPrimaries.white.Y = kSrgbWhiteY; - mInternalDisplayPrimaries.white.Z = kSrgbWhiteZ; -} - bool SurfaceFlinger::handlePageFlip() { ALOGV("handlePageFlip"); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 2d9e230b70..8687d8e312 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -685,10 +685,6 @@ private: // region of all screens presenting this layer stack. void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty); - // Initialize structures containing information about the internal - // display's native color coordinates using default data - void initDefaultDisplayNativePrimaries(); - /* ------------------------------------------------------------------------ * H/W composer */ diff --git a/services/surfaceflinger/SurfaceFlingerProperties.cpp b/services/surfaceflinger/SurfaceFlingerProperties.cpp index b654ba7669..e676d2098d 100644 --- a/services/surfaceflinger/SurfaceFlingerProperties.cpp +++ b/services/surfaceflinger/SurfaceFlingerProperties.cpp @@ -7,6 +7,7 @@ #include <android/hardware/configstore/1.2/ISurfaceFlingerConfigs.h> #include <configstore/Utils.h> +#include <cstdlib> #include <tuple> #include "SurfaceFlingerProperties.h" @@ -15,6 +16,7 @@ namespace android { namespace sysprop { using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +using ::android::hardware::configstore::V1_2::DisplayPrimaries; using ::android::hardware::graphics::common::V1_2::Dataspace; using ::android::hardware::graphics::common::V1_2::PixelFormat; @@ -242,5 +244,47 @@ int32_t wcg_composition_pixel_format(PixelFormat defaultValue) { return static_cast<int32_t>(defaultValue); } +#define DISPLAY_PRIMARY_SIZE 3 + +constexpr float kSrgbRedX = 0.4123f; +constexpr float kSrgbRedY = 0.2126f; +constexpr float kSrgbRedZ = 0.0193f; +constexpr float kSrgbGreenX = 0.3576f; +constexpr float kSrgbGreenY = 0.7152f; +constexpr float kSrgbGreenZ = 0.1192f; +constexpr float kSrgbBlueX = 0.1805f; +constexpr float kSrgbBlueY = 0.0722f; +constexpr float kSrgbBlueZ = 0.9506f; +constexpr float kSrgbWhiteX = 0.9505f; +constexpr float kSrgbWhiteY = 1.0000f; +constexpr float kSrgbWhiteZ = 1.0891f; + +DisplayPrimaries getDisplayNativePrimaries() { + auto mDisplay_primary_red = SurfaceFlingerProperties::display_primary_red(); + auto mDisplay_primary_green = SurfaceFlingerProperties::display_primary_green(); + auto mDisplay_primary_blue = SurfaceFlingerProperties::display_primary_blue(); + auto mDisplay_primary_white = SurfaceFlingerProperties::display_primary_white(); + // To avoid null point exception. + mDisplay_primary_red.resize(DISPLAY_PRIMARY_SIZE); + mDisplay_primary_green.resize(DISPLAY_PRIMARY_SIZE); + mDisplay_primary_blue.resize(DISPLAY_PRIMARY_SIZE); + mDisplay_primary_white.resize(DISPLAY_PRIMARY_SIZE); + DisplayPrimaries primaries = + {{static_cast<float>(mDisplay_primary_red[0].value_or(kSrgbRedX)), + static_cast<float>(mDisplay_primary_red[1].value_or(kSrgbRedY)), + static_cast<float>(mDisplay_primary_red[2].value_or(kSrgbRedZ))}, + {static_cast<float>(mDisplay_primary_green[0].value_or(kSrgbGreenX)), + static_cast<float>(mDisplay_primary_green[1].value_or(kSrgbGreenY)), + static_cast<float>(mDisplay_primary_green[2].value_or(kSrgbGreenZ))}, + {static_cast<float>(mDisplay_primary_blue[0].value_or(kSrgbBlueX)), + static_cast<float>(mDisplay_primary_blue[1].value_or(kSrgbBlueY)), + static_cast<float>(mDisplay_primary_blue[2].value_or(kSrgbBlueZ))}, + {static_cast<float>(mDisplay_primary_white[0].value_or(kSrgbWhiteX)), + static_cast<float>(mDisplay_primary_white[1].value_or(kSrgbWhiteY)), + static_cast<float>(mDisplay_primary_white[2].value_or(kSrgbWhiteZ))}}; + + return primaries; +} + } // namespace sysprop } // namespace android diff --git a/services/surfaceflinger/SurfaceFlingerProperties.h b/services/surfaceflinger/SurfaceFlingerProperties.h index 9b26883dae..c86880ebf5 100644 --- a/services/surfaceflinger/SurfaceFlingerProperties.h +++ b/services/surfaceflinger/SurfaceFlingerProperties.h @@ -53,6 +53,8 @@ int64_t wcg_composition_dataspace( int32_t wcg_composition_pixel_format( android::hardware::graphics::common::V1_2::PixelFormat defaultValue); + +android::hardware::configstore::V1_2::DisplayPrimaries getDisplayNativePrimaries(); } // namespace sysprop } // namespace android #endif // SURFACEFLINGERPROPERTIES_H_ diff --git a/services/surfaceflinger/sysprop/SurfaceFlingerProperties.sysprop b/services/surfaceflinger/sysprop/SurfaceFlingerProperties.sysprop index cc7b280330..429636b4a7 100644 --- a/services/surfaceflinger/sysprop/SurfaceFlingerProperties.sysprop +++ b/services/surfaceflinger/sysprop/SurfaceFlingerProperties.sysprop @@ -250,3 +250,39 @@ prop { access: Readonly prop_name: "ro.surface_flinger.wcg_composition_pixel_format" } + +# Return the native panel primary data. The data includes red, green, +# blue and white. The primary format is CIE 1931 XYZ color space. +# If unspecified, the primaries is sRGB gamut by default. + +prop { + api_name: "display_primary_red" + type: DoubleList + scope: Internal + access: Readonly + prop_name: "ro.surface_flinger.display_primary_red" +} + +prop { + api_name: "display_primary_green" + type: DoubleList + scope: Internal + access: Readonly + prop_name: "ro.surface_flinger.display_primary_green" +} + +prop { + api_name: "display_primary_blue" + type: DoubleList + scope: Internal + access: Readonly + prop_name: "ro.surface_flinger.display_primary_blue" +} + +prop { + api_name: "display_primary_white" + type: DoubleList + scope: Internal + access: Readonly + prop_name: "ro.surface_flinger.display_primary_white" +} diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index 19f308b62a..1487d47109 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -1322,32 +1322,6 @@ TEST_F(GetDisplayNativePrimaries, nullDisplayToken) { EXPECT_EQ(BAD_VALUE, mFlinger.getDisplayNativePrimaries(nullptr, primaries)); } -TEST_F(GetDisplayNativePrimaries, internalDisplayWithDefaultPrimariesData) { - auto injector = SimplePrimaryDisplayCase::Display::makeFakeExistingDisplayInjector(this); - injector.inject(); - auto internalDisplayToken = injector.token(); - // A nullptr would trigger a different execution path than what's being tested here - EXPECT_NE(nullptr, internalDisplayToken.get()); - - mFlinger.initDefaultDisplayNativePrimaries(); - - ui::DisplayPrimaries primaries; - // Expecting sRGB primaries - EXPECT_EQ(NO_ERROR, mFlinger.getDisplayNativePrimaries(internalDisplayToken, primaries)); - EXPECT_EQ(primaries.red.X, 0.4123f); - EXPECT_EQ(primaries.red.Y, 0.2126f); - EXPECT_EQ(primaries.red.Z, 0.0193f); - EXPECT_EQ(primaries.green.X, 0.3576f); - EXPECT_EQ(primaries.green.Y, 0.7152f); - EXPECT_EQ(primaries.green.Z, 0.1192f); - EXPECT_EQ(primaries.blue.X, 0.1805f); - EXPECT_EQ(primaries.blue.Y, 0.0722f); - EXPECT_EQ(primaries.blue.Z, 0.9506f); - EXPECT_EQ(primaries.white.X, 0.9505f); - EXPECT_EQ(primaries.white.Y, 1.0000f); - EXPECT_EQ(primaries.white.Z, 1.0891f); -} - TEST_F(GetDisplayNativePrimaries, internalDisplayWithPrimariesData) { auto injector = SimplePrimaryDisplayCase::Display::makeFakeExistingDisplayInjector(this); injector.inject(); diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 6313f1f10b..d61973e897 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -289,10 +289,6 @@ public: return mFlinger->SurfaceFlinger::getDisplayNativePrimaries(displayToken, primaries); } - void initDefaultDisplayNativePrimaries() { - mFlinger->SurfaceFlinger::initDefaultDisplayNativePrimaries(); - } - /* ------------------------------------------------------------------------ * Read-only access to private data to assert post-conditions. */ |