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/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);