diff options
| author | 2017-02-02 16:51:06 -0700 | |
|---|---|---|
| committer | 2017-03-03 08:05:01 -0700 | |
| commit | 1eb1b2703754beda3c20bedfca2b4fae885b7164 (patch) | |
| tree | 7cbe1745792451d2972deb61b2caad6d6085c798 | |
| parent | 297b306128550b037d6907a84db49cbb9d8e8b12 (diff) | |
Add plumbing for Surface::getWideColorSupport
Add plumbing for future Vulkan and EGL extensions
VK_EXT_swapchain_colorspace
EGL_EXT_colorspace_scrgb_linear
EGL_KHR_gl_colorspace
Test: make tests in libs/gui/tests/
Test: adb sync
Test: adb shell /data/nativetest/libgui_test/libgui_test --gtest_filter="SurfaceTest.GetWideColorSupport"
Change-Id: Ibb182d02c468d8f24130545187096d1abe5fc30e
(cherry picked from commit d634f970fabe965a421f50011bb1167d6b7cac86)
| -rw-r--r-- | include/gui/Surface.h | 3 | ||||
| -rw-r--r-- | libs/gui/Surface.cpp | 36 | ||||
| -rw-r--r-- | libs/gui/tests/Surface_test.cpp | 32 |
3 files changed, 70 insertions, 1 deletions
diff --git a/include/gui/Surface.h b/include/gui/Surface.h index a3c2bfa25b..87c6e1aa13 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -155,6 +155,8 @@ public: nsecs_t* outDisplayPresentTime, nsecs_t* outDisplayRetireTime, nsecs_t* outDequeueReadyTime, nsecs_t* outReleaseTime); + status_t getWideColorSupport(bool* supported); + status_t getUniqueId(uint64_t* outId) const; protected: @@ -215,6 +217,7 @@ private: int dispatchEnableFrameTimestamps(va_list args); int dispatchGetCompositorTiming(va_list args); int dispatchGetFrameTimestamps(va_list args); + int dispatchGetWideColorSupport(va_list args); protected: virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd); diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index efb15245a6..b7af1681a0 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -305,6 +305,34 @@ status_t Surface::getFrameTimestamps(uint64_t frameNumber, return NO_ERROR; } +status_t Surface::getWideColorSupport(bool* supported) { + ATRACE_CALL(); + + sp<IBinder> display( + composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); + Vector<android_color_mode_t> colorModes; + status_t err = + composerService()->getDisplayColorModes(display, &colorModes); + + if (err) + return err; + + *supported = false; + for (android_color_mode_t colorMode : colorModes) { + switch (colorMode) { + case HAL_COLOR_MODE_DISPLAY_P3: + case HAL_COLOR_MODE_ADOBE_RGB: + case HAL_COLOR_MODE_DCI_P3: + *supported = true; + break; + default: + break; + } + } + + return NO_ERROR; +} + int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { Surface* c = getSelf(window); return c->setSwapInterval(interval); @@ -880,6 +908,9 @@ int Surface::perform(int operation, va_list args) case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS: res = dispatchGetFrameTimestamps(args); break; + case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT: + res = dispatchGetWideColorSupport(args); + break; default: res = NAME_NOT_FOUND; break; @@ -1044,6 +1075,11 @@ int Surface::dispatchGetFrameTimestamps(va_list args) { outDisplayRetireTime, outDequeueReadyTime, outReleaseTime); } +int Surface::dispatchGetWideColorSupport(va_list args) { + bool* outSupport = va_arg(args, bool*); + return getWideColorSupport(outSupport); +} + int Surface::connect(int api) { static sp<IProducerListener> listener = new DummyProducerListener(); return connect(api, listener); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 012dbe7c95..da6f13d520 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -19,11 +19,12 @@ #include <gtest/gtest.h> #include <binder/ProcessState.h> +#include <cutils/properties.h> +#include <gui/BufferItemConsumer.h> #include <gui/IDisplayEventConnection.h> #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> -#include <gui/BufferItemConsumer.h> #include <private/gui/ComposerService.h> #include <ui/Rect.h> #include <utils/String8.h> @@ -252,6 +253,35 @@ TEST_F(SurfaceTest, GetConsumerName) { EXPECT_STREQ("TestConsumer", surface->getConsumerName().string()); } +TEST_F(SurfaceTest, GetWideColorSupport) { + sp<IGraphicBufferProducer> producer; + sp<IGraphicBufferConsumer> consumer; + BufferQueue::createBufferQueue(&producer, &consumer); + + sp<DummyConsumer> dummyConsumer(new DummyConsumer); + consumer->consumerConnect(dummyConsumer, false); + consumer->setConsumerName(String8("TestConsumer")); + + sp<Surface> surface = new Surface(producer); + sp<ANativeWindow> window(surface); + native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU); + + bool supported; + surface->getWideColorSupport(&supported); + + // TODO(courtneygo): How can we know what device we are on to + // verify that this is correct? + char product[PROPERTY_VALUE_MAX] = "0"; + property_get("ro.build.product", product, "0"); + std::cerr << "[ ] product = " << product << std::endl; + + if (strcmp("marlin", product) == 0 || strcmp("sailfish", product) == 0) { + ASSERT_EQ(true, supported); + } else { + ASSERT_EQ(false, supported); + } +} + TEST_F(SurfaceTest, DynamicSetBufferCount) { sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; |