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/include/gui/GLConsumer.h b/include/gui/GLConsumer.h
index 493ecde..f8ded74 100644
--- a/include/gui/GLConsumer.h
+++ b/include/gui/GLConsumer.h
@@ -146,6 +146,10 @@
// documented by the source.
int64_t getTimestamp();
+ // getDataSpace retrieves the DataSpace associated with the texture image
+ // set by the most recent call to updateTexImage.
+ android_dataspace getCurrentDataSpace();
+
// getFrameNumber retrieves the frame number associated with the texture
// image set by the most recent call to updateTexImage.
//
@@ -414,6 +418,10 @@
// gets set each time updateTexImage is called.
int64_t mCurrentTimestamp;
+ // mCurrentDataSpace is the dataspace for the current texture. It
+ // gets set each time updateTexImage is called.
+ android_dataspace mCurrentDataSpace;
+
// mCurrentFrameNumber is the frame counter for the current texture.
// It gets set each time updateTexImage is called.
uint64_t mCurrentFrameNumber;
diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp
index fea9df7..b11a3e5 100644
--- a/libs/gui/GLConsumer.cpp
+++ b/libs/gui/GLConsumer.cpp
@@ -157,6 +157,7 @@
mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
mCurrentFence(Fence::NO_FENCE),
mCurrentTimestamp(0),
+ mCurrentDataSpace(HAL_DATASPACE_UNKNOWN),
mCurrentFrameNumber(0),
mDefaultWidth(1),
mDefaultHeight(1),
@@ -185,6 +186,7 @@
mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
mCurrentFence(Fence::NO_FENCE),
mCurrentTimestamp(0),
+ mCurrentDataSpace(HAL_DATASPACE_UNKNOWN),
mCurrentFrameNumber(0),
mDefaultWidth(1),
mDefaultHeight(1),
@@ -321,6 +323,7 @@
mCurrentCrop.makeInvalid();
mCurrentTransform = 0;
mCurrentTimestamp = 0;
+ mCurrentDataSpace = HAL_DATASPACE_UNKNOWN;
mCurrentFence = Fence::NO_FENCE;
mCurrentFenceTime = FenceTime::NO_FENCE;
@@ -488,6 +491,7 @@
mCurrentTransform = item.mTransform;
mCurrentScalingMode = item.mScalingMode;
mCurrentTimestamp = item.mTimestamp;
+ mCurrentDataSpace = item.mDataSpace;
mCurrentFence = item.mFence;
mCurrentFenceTime = item.mFenceTime;
mCurrentFrameNumber = item.mFrameNumber;
@@ -914,6 +918,12 @@
return mCurrentTimestamp;
}
+android_dataspace GLConsumer::getCurrentDataSpace() {
+ GLC_LOGV("getCurrentDataSpace");
+ Mutex::Autolock lock(mMutex);
+ return mCurrentDataSpace;
+}
+
uint64_t GLConsumer::getFrameNumber() {
GLC_LOGV("getFrameNumber");
Mutex::Autolock lock(mMutex);
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());
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 15a9552..801b9d0 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -137,6 +137,7 @@
// dependent.
Region activeTransparentRegion;
Region requestedTransparentRegion;
+ android_dataspace dataSpace;
};
// -----------------------------------------------------------------------
@@ -164,6 +165,7 @@
bool setCrop(const Rect& crop, bool immediate);
bool setFinalCrop(const Rect& crop);
bool setLayerStack(uint32_t layerStack);
+ bool setDataSpace(android_dataspace dataSpace);
void deferTransactionUntil(const sp<IBinder>& handle, uint64_t frameNumber);
bool setOverrideScalingMode(int32_t overrideScalingMode);