Make dataspace accessible to surface flinger
http://b/29940137
Keep track of dataspace in GLConsumer and make it
available to surfaceflinger's Layer class.
Test: TBD
Change-Id: I099dc6d8424909c5fc31bfe2d05a656695c4251b
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 22d01ae..24948c8 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -139,6 +139,7 @@
mCurrentState.flags = layerFlags;
mCurrentState.sequence = 0;
mCurrentState.requested = mCurrentState.active;
+ mCurrentState.dataSpace = HAL_DATASPACE_UNKNOWN;
// drawing state & current state are identical
mDrawingState = mCurrentState;
@@ -751,6 +752,14 @@
setCompositionType(hwcId, HWC2::Composition::Device);
}
+ ALOGV("setPerFrameData: dataspace = %d", mCurrentState.dataSpace);
+ error = hwcLayer->setDataspace(mCurrentState.dataSpace);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(),
+ mCurrentState.dataSpace, to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
+
auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
error = hwcLayer->setBuffer(mActiveBuffer->handle, acquireFence);
if (error != HWC2::Error::None) {
@@ -1680,6 +1689,16 @@
return true;
}
+bool Layer::setDataSpace(android_dataspace dataSpace) {
+ if (mCurrentState.dataSpace == dataSpace)
+ return false;
+ mCurrentState.sequence++;
+ mCurrentState.dataSpace = dataSpace;
+ mCurrentState.modified = true;
+ setTransactionFlags(eTransactionNeeded);
+ return true;
+}
+
void Layer::deferTransactionUntil(const sp<IBinder>& handle,
uint64_t frameNumber) {
mCurrentState.handle = handle;
@@ -1993,6 +2012,8 @@
recomputeVisibleRegions = true;
}
+ setDataSpace(mSurfaceFlingerConsumer->getCurrentDataSpace());
+
Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());