Add plumbing for Surface::getHdrSupport
Add plumbing for future Vulkan and EGL extensions
VK_EXT_swapchain_colorspace
EGL_EXT_colorspace_scrgb_linear
EGL_KHR_gl_colorspace
Test: TBD
Change-Id: Id1f28cfb36828adbdc6dd3694b5943eca038c356
diff --git a/include/gui/Surface.h b/include/gui/Surface.h
index 87c6e1a..cfc68c6 100644
--- a/include/gui/Surface.h
+++ b/include/gui/Surface.h
@@ -156,6 +156,7 @@
nsecs_t* outDequeueReadyTime, nsecs_t* outReleaseTime);
status_t getWideColorSupport(bool* supported);
+ status_t getHdrSupport(bool* supported);
status_t getUniqueId(uint64_t* outId) const;
@@ -218,6 +219,7 @@
int dispatchGetCompositorTiming(va_list args);
int dispatchGetFrameTimestamps(va_list args);
int dispatchGetWideColorSupport(va_list args);
+ int dispatchGetHdrSupport(va_list args);
protected:
virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd);
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
index b7af168..ad1984a 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -26,9 +26,10 @@
#include <utils/Trace.h>
#include <utils/NativeHandle.h>
-#include <ui/Fence.h>
-#include <ui/Region.h>
#include <ui/DisplayStatInfo.h>
+#include <ui/Fence.h>
+#include <ui/HdrCapabilities.h>
+#include <ui/Region.h>
#include <gui/BufferItem.h>
#include <gui/IProducerListener.h>
@@ -333,6 +334,23 @@
return NO_ERROR;
}
+status_t Surface::getHdrSupport(bool* supported) {
+ ATRACE_CALL();
+
+ sp<IBinder> display(
+ composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
+ HdrCapabilities hdrCapabilities;
+ status_t err =
+ composerService()->getHdrCapabilities(display, &hdrCapabilities);
+
+ if (err)
+ return err;
+
+ *supported = !hdrCapabilities.getSupportedHdrTypes().empty();
+
+ return NO_ERROR;
+}
+
int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) {
Surface* c = getSelf(window);
return c->setSwapInterval(interval);
@@ -911,6 +929,9 @@
case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT:
res = dispatchGetWideColorSupport(args);
break;
+ case NATIVE_WINDOW_GET_HDR_SUPPORT:
+ res = dispatchGetHdrSupport(args);
+ break;
default:
res = NAME_NOT_FOUND;
break;
@@ -1080,6 +1101,11 @@
return getWideColorSupport(outSupport);
}
+int Surface::dispatchGetHdrSupport(va_list args) {
+ bool* outSupport = va_arg(args, bool*);
+ return getHdrSupport(outSupport);
+}
+
int Surface::connect(int api) {
static sp<IProducerListener> listener = new DummyProducerListener();
return connect(api, listener);