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};