HWC2: Hook up setColorTransform/setLayerDataspace

Plumbs the setColorTransform and setLayerDataspace calls through the
HWC2 C++ shim and implements a trivial versions in the adapter,
which drops non-HAL_DATASPACE_UNKNOWN layers to client composition,
and which drops all layers to client composition if a color transform
is applied.

Bug: 22767098
Change-Id: Ifffd19b77cf3b33ec86fde3f72257f6b97b4dd79
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index f7678e4..f53e0a2 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -107,6 +107,7 @@
     mPresentDisplay(nullptr),
     mSetActiveConfig(nullptr),
     mSetClientTarget(nullptr),
+    mSetColorTransform(nullptr),
     mSetOutputBuffer(nullptr),
     mSetPowerMode(nullptr),
     mSetVsyncEnabled(nullptr),
@@ -117,6 +118,7 @@
     mSetLayerBlendMode(nullptr),
     mSetLayerColor(nullptr),
     mSetLayerCompositionType(nullptr),
+    mSetLayerDataspace(nullptr),
     mSetLayerDisplayFrame(nullptr),
     mSetLayerPlaneAlpha(nullptr),
     mSetLayerSidebandStream(nullptr),
@@ -359,6 +361,8 @@
             mSetActiveConfig)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget,
             mSetClientTarget)) return;
+    if (!loadFunctionPointer(FunctionDescriptor::SetColorTransform,
+            mSetColorTransform)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer,
             mSetOutputBuffer)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode,
@@ -381,6 +385,8 @@
             mSetLayerColor)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType,
             mSetLayerCompositionType)) return;
+    if (!loadFunctionPointer(FunctionDescriptor::SetLayerDataspace,
+            mSetLayerDataspace)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame,
             mSetLayerDisplayFrame)) return;
     if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha,
@@ -752,6 +758,14 @@
     return static_cast<Error>(intError);
 }
 
+Error Display::setColorTransform(const android::mat4& matrix,
+        android_color_transform_t hint)
+{
+    int32_t intError = mDevice.mSetColorTransform(mDevice.mHwcDevice, mId,
+            matrix.asArray(), static_cast<int32_t>(hint));
+    return static_cast<Error>(intError);
+}
+
 Error Display::setOutputBuffer(const sp<GraphicBuffer>& buffer,
         const sp<Fence>& releaseFence)
 {
@@ -965,6 +979,14 @@
     return static_cast<Error>(intError);
 }
 
+Error Layer::setDataspace(android_dataspace_t dataspace)
+{
+    auto intDataspace = static_cast<int32_t>(dataspace);
+    int32_t intError = mDevice.mSetLayerDataspace(mDevice.mHwcDevice,
+            mDisplayId, mId, intDataspace);
+    return static_cast<Error>(intError);
+}
+
 Error Layer::setDisplayFrame(const Rect& frame)
 {
     hwc_rect_t hwcRect{frame.left, frame.top, frame.right, frame.bottom};