SF: Move state out of DisplayDevice to a new Output class

CompositionEngine::Output holds the composition state of an output. A
CompositionEngine::Display is an output, so it derives from it.

The state is removed from DisplayDevice, with some (temporary) accessors
left behind as there are more changes coming.

The composition related code in SurfaceFlinger is adjusted to however
use the output state.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: Idae2d3d96315538d006b27b56e0a8b566ce0e3b8
diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp
index a0b277c..fb783e7 100644
--- a/services/surfaceflinger/CompositionEngine/src/Display.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-#include <cinttypes>
-
+#include <android-base/stringprintf.h>
 #include <compositionengine/CompositionEngine.h>
 #include <compositionengine/DisplayCreationArgs.h>
 #include <compositionengine/impl/Display.h>
+#include <compositionengine/impl/DumpHelpers.h>
 
 #include "DisplayHardware/HWComposer.h"
 
@@ -31,10 +31,11 @@
 }
 
 Display::Display(const CompositionEngine& compositionEngine, DisplayCreationArgs&& args)
-      : mCompositionEngine(compositionEngine),
-        mIsSecure(args.isSecure),
+      : compositionengine::impl::Output(compositionEngine),
         mIsVirtual(args.isVirtual),
-        mId(args.displayId) {}
+        mId(args.displayId) {
+    editState().isSecure = args.isSecure;
+}
 
 Display::~Display() = default;
 
@@ -43,7 +44,7 @@
 }
 
 bool Display::isSecure() const {
-    return mIsSecure;
+    return getState().isSecure;
 }
 
 bool Display::isVirtual() const {
@@ -55,9 +56,55 @@
         return;
     }
 
-    auto& hwc = mCompositionEngine.getHwComposer();
+    auto& hwc = getCompositionEngine().getHwComposer();
     hwc.disconnectDisplay(*mId);
     mId.reset();
 }
 
+void Display::setColorTransform(const mat4& transform) {
+    Output::setColorTransform(transform);
+
+    auto& hwc = getCompositionEngine().getHwComposer();
+    status_t result = hwc.setColorTransform(*mId, transform);
+    ALOGE_IF(result != NO_ERROR, "Failed to set color transform on display \"%s\": %d",
+             mId ? to_string(*mId).c_str() : "", result);
+}
+
+void Display::setColorMode(ui::ColorMode mode, ui::Dataspace dataspace,
+                           ui::RenderIntent renderIntent) {
+    if (mode == getState().colorMode && dataspace == getState().dataspace &&
+        renderIntent == getState().renderIntent) {
+        return;
+    }
+
+    if (mIsVirtual) {
+        ALOGW("%s: Invalid operation on virtual display", __FUNCTION__);
+        return;
+    }
+
+    Output::setColorMode(mode, dataspace, renderIntent);
+
+    auto& hwc = getCompositionEngine().getHwComposer();
+    hwc.setActiveColorMode(*mId, mode, renderIntent);
+}
+
+void Display::dump(std::string& out) const {
+    using android::base::StringAppendF;
+
+    StringAppendF(&out, "   Composition Display State: [\"%s\"]", getName().c_str());
+
+    out.append("\n   ");
+
+    dumpVal(out, "isVirtual", mIsVirtual);
+    if (mId) {
+        dumpVal(out, "hwcId", to_string(*mId));
+    } else {
+        StringAppendF(&out, "no hwcId, ");
+    }
+
+    out.append("\n");
+
+    Output::dumpBase(out);
+}
+
 } // namespace android::compositionengine::impl