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

Commit 1eb1b270 authored by Courtney Goeltzenleuchter's avatar Courtney Goeltzenleuchter
Browse files

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)
parent 297b3061
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -155,6 +155,8 @@ public:
            nsecs_t* outDisplayPresentTime, nsecs_t* outDisplayRetireTime,
            nsecs_t* outDisplayPresentTime, nsecs_t* outDisplayRetireTime,
            nsecs_t* outDequeueReadyTime, nsecs_t* outReleaseTime);
            nsecs_t* outDequeueReadyTime, nsecs_t* outReleaseTime);


    status_t getWideColorSupport(bool* supported);

    status_t getUniqueId(uint64_t* outId) const;
    status_t getUniqueId(uint64_t* outId) const;


protected:
protected:
@@ -215,6 +217,7 @@ private:
    int dispatchEnableFrameTimestamps(va_list args);
    int dispatchEnableFrameTimestamps(va_list args);
    int dispatchGetCompositorTiming(va_list args);
    int dispatchGetCompositorTiming(va_list args);
    int dispatchGetFrameTimestamps(va_list args);
    int dispatchGetFrameTimestamps(va_list args);
    int dispatchGetWideColorSupport(va_list args);


protected:
protected:
    virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd);
    virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd);
+36 −0
Original line number Original line Diff line number Diff line
@@ -305,6 +305,34 @@ status_t Surface::getFrameTimestamps(uint64_t frameNumber,
    return NO_ERROR;
    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) {
int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) {
    Surface* c = getSelf(window);
    Surface* c = getSelf(window);
    return c->setSwapInterval(interval);
    return c->setSwapInterval(interval);
@@ -880,6 +908,9 @@ int Surface::perform(int operation, va_list args)
    case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS:
    case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS:
        res = dispatchGetFrameTimestamps(args);
        res = dispatchGetFrameTimestamps(args);
        break;
        break;
    case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT:
        res = dispatchGetWideColorSupport(args);
        break;
    default:
    default:
        res = NAME_NOT_FOUND;
        res = NAME_NOT_FOUND;
        break;
        break;
@@ -1044,6 +1075,11 @@ int Surface::dispatchGetFrameTimestamps(va_list args) {
            outDisplayRetireTime, outDequeueReadyTime, outReleaseTime);
            outDisplayRetireTime, outDequeueReadyTime, outReleaseTime);
}
}


int Surface::dispatchGetWideColorSupport(va_list args) {
    bool* outSupport = va_arg(args, bool*);
    return getWideColorSupport(outSupport);
}

int Surface::connect(int api) {
int Surface::connect(int api) {
    static sp<IProducerListener> listener = new DummyProducerListener();
    static sp<IProducerListener> listener = new DummyProducerListener();
    return connect(api, listener);
    return connect(api, listener);
+31 −1
Original line number Original line Diff line number Diff line
@@ -19,11 +19,12 @@
#include <gtest/gtest.h>
#include <gtest/gtest.h>


#include <binder/ProcessState.h>
#include <binder/ProcessState.h>
#include <cutils/properties.h>
#include <gui/BufferItemConsumer.h>
#include <gui/IDisplayEventConnection.h>
#include <gui/IDisplayEventConnection.h>
#include <gui/ISurfaceComposer.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/BufferItemConsumer.h>
#include <private/gui/ComposerService.h>
#include <private/gui/ComposerService.h>
#include <ui/Rect.h>
#include <ui/Rect.h>
#include <utils/String8.h>
#include <utils/String8.h>
@@ -252,6 +253,35 @@ TEST_F(SurfaceTest, GetConsumerName) {
    EXPECT_STREQ("TestConsumer", surface->getConsumerName().string());
    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) {
TEST_F(SurfaceTest, DynamicSetBufferCount) {
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    sp<IGraphicBufferConsumer> consumer;