surfacefligner: revert recent BE/FE split changes
This reverts the following changes:
"SF: Restructure message refresh"
"SF: Add sideband stream setup to setUpHwComposer"
"SF: Support SolidColor layers in setUpHwComposer"
"SF: Move config of HWComposer to setupHwComposer"
"SF: Use CompositionInfo to program HWComposer"
Bug: 76421986
Bug: 76426897
Bug: 76432611
Test: manual and CTS
Change-Id: Ia0c5edaa3a077ba148c8880bee740381fd72f2ca
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp
index 916576a..7dad780 100644
--- a/services/surfaceflinger/BufferLayer.cpp
+++ b/services/surfaceflinger/BufferLayer.cpp
@@ -593,14 +593,32 @@
const auto& viewport = displayDevice->getViewport();
Region visible = tr.transform(visibleRegion.intersect(viewport));
auto hwcId = displayDevice->getHwcDisplayId();
+ auto& hwcInfo = getBE().mHwcLayers[hwcId];
+ auto& hwcLayer = hwcInfo.layer;
+ auto error = (*hwcLayer)->setVisibleRegion(visible);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ visible.dump(LOG_TAG);
+ }
- getBE().compositionInfo.hwc.visibleRegion = visible;
- getBE().compositionInfo.hwc.surfaceDamage = surfaceDamageRegion;
+ error = (*hwcLayer)->setSurfaceDamage(surfaceDamageRegion);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ surfaceDamageRegion.dump(LOG_TAG);
+ }
// Sideband layers
if (getBE().compositionInfo.hwc.sidebandStream.get()) {
setCompositionType(hwcId, HWC2::Composition::Sideband);
- getBE().compositionInfo.compositionType = HWC2::Composition::Sideband;
+ ALOGV("[%s] Requesting Sideband composition", mName.string());
+ error = (*hwcLayer)->setSidebandStream(getBE().compositionInfo.hwc.sidebandStream->handle());
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", mName.string(),
+ getBE().compositionInfo.hwc.sidebandStream->handle(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
return;
}
@@ -613,13 +631,32 @@
setCompositionType(hwcId, HWC2::Composition::Device);
}
- getBE().compositionInfo.hwc.dataspace = mDrawingState.dataSpace;
- getBE().compositionInfo.hwc.hdrMetadata = mConsumer->getCurrentHdrMetadata();
+ ALOGV("setPerFrameData: dataspace = %d", mDrawingState.dataSpace);
+ error = (*hwcLayer)->setDataspace(mDrawingState.dataSpace);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), mDrawingState.dataSpace,
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ }
+
+ const HdrMetadata& metadata = mConsumer->getCurrentHdrMetadata();
+ error = (*hwcLayer)->setHdrMetadata(metadata);
+ if (error != HWC2::Error::None && error != HWC2::Error::Unsupported) {
+ ALOGE("[%s] Failed to set hdrMetadata: %s (%d)", mName.string(),
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ }
+
+ uint32_t hwcSlot = 0;
+ sp<GraphicBuffer> hwcBuffer;
+ getBE().mHwcLayers[hwcId].bufferCache.getHwcBuffer(mActiveBufferSlot, mActiveBuffer, &hwcSlot,
+ &hwcBuffer);
auto acquireFence = mConsumer->getCurrentFence();
- getBE().compositionInfo.mBufferSlot = mActiveBufferSlot;
- getBE().compositionInfo.mBuffer = mActiveBuffer;
- getBE().compositionInfo.hwc.fence = acquireFence;
+ error = (*hwcLayer)->setBuffer(hwcSlot, hwcBuffer, acquireFence);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
+ getBE().compositionInfo.mBuffer->handle, to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
}
bool BufferLayer::isOpaque(const Layer::State& s) const {
@@ -793,17 +830,27 @@
texCoords[2] = vec2(right, 1.0f - bottom);
texCoords[3] = vec2(right, 1.0f - top);
- getBE().compositionInfo.re.preMultipliedAlpha = mPremultipliedAlpha;
- getBE().compositionInfo.re.opaque = isOpaque(s);
- getBE().compositionInfo.re.disableTexture = false;
- getBE().compositionInfo.re.color = getColor();
- getBE().compositionInfo.hwc.dataspace = mCurrentState.dataSpace;
+ //getBE().compositionInfo.re.preMultipliedAlpha = mPremultipliedAlpha;
+ //getBE().compositionInfo.re.opaque = isOpaque(s);
+ //getBE().compositionInfo.re.disableTexture = false;
+ //getBE().compositionInfo.re.color = getColor();
+ //getBE().compositionInfo.hwc.dataspace = mCurrentState.dataSpace;
+ auto& engine(mFlinger->getRenderEngine());
+ engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), false /* disableTexture */,
+ getColor());
+ engine.setSourceDataSpace(mCurrentState.dataSpace);
+
if (mCurrentState.dataSpace == HAL_DATASPACE_BT2020_ITU_PQ &&
mConsumer->getCurrentApi() == NATIVE_WINDOW_API_MEDIA &&
getBE().compositionInfo.mBuffer->getPixelFormat() == HAL_PIXEL_FORMAT_RGBA_1010102) {
- getBE().compositionInfo.re.Y410BT2020 = true;
+ engine.setSourceY410BT2020(true);
}
+
+ engine.drawMesh(getBE().mMesh);
+ engine.disableBlending();
+
+ engine.setSourceY410BT2020(false);
}
uint32_t BufferLayer::getProducerStickyTransform() const {
diff --git a/services/surfaceflinger/ColorLayer.cpp b/services/surfaceflinger/ColorLayer.cpp
index 5990a61..71975c8 100644
--- a/services/surfaceflinger/ColorLayer.cpp
+++ b/services/surfaceflinger/ColorLayer.cpp
@@ -77,18 +77,38 @@
const auto& viewport = displayDevice->getViewport();
Region visible = tr.transform(visibleRegion.intersect(viewport));
auto hwcId = displayDevice->getHwcDisplayId();
- getBE().compositionInfo.hwc.visibleRegion = visible;
- getBE().compositionInfo.hwc.dataspace = mDrawingState.dataSpace;
+ auto& hwcInfo = getBE().mHwcLayers[hwcId];
+ auto& hwcLayer = hwcInfo.layer;
+ auto error = (*hwcLayer)->setVisibleRegion(visible);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ visible.dump(LOG_TAG);
+ }
setCompositionType(hwcId, HWC2::Composition::SolidColor);
+ error = (*hwcLayer)->setDataspace(mDrawingState.dataSpace);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set dataspace %d: %s (%d)", mName.string(), mDrawingState.dataSpace,
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ }
+
half4 color = getColor();
- getBE().compositionInfo.hwc.color = { static_cast<uint8_t>(std::round(255.0f * color.r)),
- static_cast<uint8_t>(std::round(255.0f * color.g)),
- static_cast<uint8_t>(std::round(255.0f * color.b)), 255 };
+ error = (*hwcLayer)->setColor({static_cast<uint8_t>(std::round(255.0f * color.r)),
+ static_cast<uint8_t>(std::round(255.0f * color.g)),
+ static_cast<uint8_t>(std::round(255.0f * color.b)), 255});
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set color: %s (%d)", mName.string(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
// Clear out the transform, because it doesn't make sense absent a source buffer
- getBE().compositionInfo.hwc.transform = HWC2::Transform::None;
+ error = (*hwcLayer)->setTransform(HWC2::Transform::None);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
}
// ---------------------------------------------------------------------------
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index b86408e..615270f 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -483,9 +483,6 @@
const auto hwcId = displayDevice->getHwcDisplayId();
auto& hwcInfo = getBE().mHwcLayers[hwcId];
- // Need to program geometry parts
- getBE().compositionInfo.hwc.skipGeometry = false;
-
// enable this layer
hwcInfo.forceClientComposition = false;
@@ -493,6 +490,8 @@
hwcInfo.forceClientComposition = true;
}
+ auto& hwcLayer = hwcInfo.layer;
+
// this gives us only the "orientation" component of the transform
const State& s(getDrawingState());
auto blendMode = HWC2::BlendMode::None;
@@ -500,7 +499,12 @@
blendMode =
mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
}
- getBE().compositionInfo.hwc.blendMode = blendMode;
+ auto error = (*hwcLayer)->setBlendMode(blendMode);
+ ALOGE_IF(error != HWC2::Error::None,
+ "[%s] Failed to set blend mode %s:"
+ " %s (%d)",
+ mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
// apply the layer's transform, followed by the display's global transform
// here we're guaranteed that the layer's transform preserves rects
@@ -543,15 +547,36 @@
}
const Transform& tr(displayDevice->getTransform());
Rect transformedFrame = tr.transform(frame);
- getBE().compositionInfo.hwc.displayFrame = transformedFrame;
+ error = (*hwcLayer)->setDisplayFrame(transformedFrame);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(),
+ transformedFrame.left, transformedFrame.top, transformedFrame.right,
+ transformedFrame.bottom, to_string(error).c_str(), static_cast<int32_t>(error));
+ } else {
+ hwcInfo.displayFrame = transformedFrame;
+ }
FloatRect sourceCrop = computeCrop(displayDevice);
- getBE().compositionInfo.hwc.sourceCrop = sourceCrop;
+ error = (*hwcLayer)->setSourceCrop(sourceCrop);
+ if (error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: "
+ "%s (%d)",
+ mName.string(), sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom,
+ to_string(error).c_str(), static_cast<int32_t>(error));
+ } else {
+ hwcInfo.sourceCrop = sourceCrop;
+ }
float alpha = static_cast<float>(getAlpha());
- getBE().compositionInfo.hwc.alpha = alpha;
+ error = (*hwcLayer)->setPlaneAlpha(alpha);
+ ALOGE_IF(error != HWC2::Error::None,
+ "[%s] Failed to set plane alpha %.3f: "
+ "%s (%d)",
+ mName.string(), alpha, to_string(error).c_str(), static_cast<int32_t>(error));
- getBE().compositionInfo.hwc.z = z;
+ error = (*hwcLayer)->setZOrder(z);
+ ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", mName.string(), z,
+ to_string(error).c_str(), static_cast<int32_t>(error));
int type = s.type;
int appId = s.appId;
@@ -564,8 +589,9 @@
}
}
- getBE().compositionInfo.hwc.type = type;
- getBE().compositionInfo.hwc.appId = appId;
+ error = (*hwcLayer)->setInfo(type, appId);
+ ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(),
+ static_cast<int32_t>(error));
/*
* Transformations are applied in this order:
@@ -608,11 +634,16 @@
const uint32_t orientation = transform.getOrientation();
if (orientation & Transform::ROT_INVALID || extremeScaling) {
// we can only handle simple transformation
- getBE().mHwcLayers[hwcId].compositionType = HWC2::Composition::Client;
+ hwcInfo.forceClientComposition = true;
} else {
auto transform = static_cast<HWC2::Transform>(orientation);
hwcInfo.transform = transform;
- getBE().compositionInfo.hwc.transform = transform;
+ auto error = (*hwcLayer)->setTransform(transform);
+ ALOGE_IF(error != HWC2::Error::None,
+ "[%s] Failed to set transform %s: "
+ "%s (%d)",
+ mName.string(), to_string(transform).c_str(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
}
}
@@ -697,12 +728,26 @@
clearWithOpenGL(renderArea, 0, 0, 0, 0);
}
-void Layer::setCompositionType(int32_t /*hwcId*/, HWC2::Composition type, bool /*callIntoHwc*/) {
- if (getBE().compositionInfo.compositionType != type) {
- ALOGV("setCompositionType: Changing compositionType from %s to %s",
- to_string(getBE().compositionInfo.compositionType).c_str(),
- to_string(type).c_str());
- getBE().compositionInfo.compositionType = type;
+void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) {
+ if (getBE().mHwcLayers.count(hwcId) == 0) {
+ ALOGE("setCompositionType called without a valid HWC layer");
+ return;
+ }
+ auto& hwcInfo = getBE().mHwcLayers[hwcId];
+ auto& hwcLayer = hwcInfo.layer;
+ ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", (*hwcLayer)->getId(), to_string(type).c_str(),
+ static_cast<int>(callIntoHwc));
+ if (hwcInfo.compositionType != type) {
+ ALOGV(" actually setting");
+ hwcInfo.compositionType = type;
+ if (callIntoHwc) {
+ auto error = (*hwcLayer)->setCompositionType(type);
+ ALOGE_IF(error != HWC2::Error::None,
+ "[%s] Failed to set "
+ "composition type %s: %s (%d)",
+ mName.string(), to_string(type).c_str(), to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
}
}
@@ -712,7 +757,11 @@
// have a HWC counterpart, then it will always be Client
return HWC2::Composition::Client;
}
- return getBE().compositionInfo.compositionType;
+ if (getBE().mHwcLayers.count(hwcId) == 0) {
+ ALOGE("getCompositionType called with an invalid HWC layer");
+ return HWC2::Composition::Invalid;
+ }
+ return getBE().mHwcLayers.at(hwcId).compositionType;
}
void Layer::setClearClientTarget(int32_t hwcId, bool clear) {
@@ -1441,11 +1490,12 @@
result.appendFormat(" %s\n", name.string());
const Layer::State& layerState(getDrawingState());
+ const LayerBE::HWCInfo& hwcInfo = getBE().mHwcLayers.at(hwcId);
result.appendFormat(" %10d | ", layerState.z);
result.appendFormat("%10s | ", to_string(getCompositionType(hwcId)).c_str());
- const Rect& frame = getBE().compositionInfo.hwc.displayFrame;
+ const Rect& frame = hwcInfo.displayFrame;
result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
- const FloatRect& crop = getBE().compositionInfo.hwc.sourceCrop;
+ const FloatRect& crop = hwcInfo.sourceCrop;
result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, crop.right, crop.bottom);
result.append("- - - - - - - - - - - - - - - - - - - - ");
diff --git a/services/surfaceflinger/LayerBE.h b/services/surfaceflinger/LayerBE.h
index fafe165..854cdd6 100644
--- a/services/surfaceflinger/LayerBE.h
+++ b/services/surfaceflinger/LayerBE.h
@@ -19,7 +19,6 @@
#include <stdint.h>
#include <sys/types.h>
-#include <gui/HdrMetadata.h>
#include <ui/Region.h>
#include "SurfaceFlinger.h"
@@ -66,7 +65,6 @@
LayerBE* layer = nullptr;
struct {
std::shared_ptr<LayerContainer> hwcLayer;
- bool skipGeometry = true;
int32_t hwid = -1;
sp<Fence> fence;
HWC2::BlendMode blendMode = HWC2::BlendMode::Invalid;
@@ -82,7 +80,6 @@
sp<NativeHandle> sidebandStream;
android_dataspace dataspace;
hwc_color_t color;
- HdrMetadata hdrMetadata;
} hwc;
struct {
Mesh* mesh;
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a21b7ea..f709534 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -674,7 +674,6 @@
// set initial conditions (e.g. unblank default device)
initializeDisplays();
- ALOGV("Displays initialized");
getBE().mRenderEngine->primeCache();
@@ -1443,13 +1442,7 @@
bool refreshNeeded = handleMessageTransaction();
refreshNeeded |= handleMessageInvalidate();
refreshNeeded |= mRepaintEverything;
-
- preComposition();
- rebuildLayerStacks();
- calculateWorkingSet();
-
if (refreshNeeded) {
-
// Signal a refresh if a transaction modified the window state,
// a new buffer was latched, or if HWC has requested a full
// repaint
@@ -1478,120 +1471,21 @@
return handlePageFlip();
}
-void SurfaceFlinger::calculateWorkingSet() {
- ATRACE_CALL();
- ALOGV(__FUNCTION__);
-
- // build the h/w work list
- if (CC_UNLIKELY(mGeometryInvalid)) {
- mGeometryInvalid = false;
- for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
- sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
- const auto hwcId = displayDevice->getHwcDisplayId();
- if (hwcId >= 0) {
- const Vector<sp<Layer>>& currentLayers(
- displayDevice->getVisibleLayersSortedByZ());
- for (size_t i = 0; i < currentLayers.size(); i++) {
- const auto& layer = currentLayers[i];
-
- if (!layer->hasHwcLayer(hwcId)) {
- if (!layer->createHwcLayer(getBE().mHwc.get(), hwcId)) {
- layer->forceClientComposition(hwcId);
- continue;
- }
- }
-
- layer->setGeometry(displayDevice, i);
- if (mDebugDisableHWC || mDebugRegion) {
- layer->forceClientComposition(hwcId);
- }
- }
- }
- }
- }
- mat4 colorMatrix = mColorMatrix * computeSaturationMatrix() * mDaltonizer();
-
- // Set the per-frame data
- for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
- auto& displayDevice = mDisplays[displayId];
- const auto hwcId = displayDevice->getHwcDisplayId();
-
- if (hwcId < 0) {
- continue;
- }
- if (colorMatrix != mPreviousColorMatrix) {
- status_t result = getBE().mHwc->setColorTransform(hwcId, colorMatrix);
- ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
- "display %zd: %d", displayId, result);
- }
- for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
- if ((layer->getDataSpace() == HAL_DATASPACE_BT2020_PQ ||
- layer->getDataSpace() == HAL_DATASPACE_BT2020_ITU_PQ) &&
- !displayDevice->getHdrSupport()) {
- layer->forceClientComposition(hwcId);
- }
-
- if (layer->getForceClientComposition(hwcId)) {
- ALOGV("[%s] Requesting Client composition", layer->getName().string());
- layer->setCompositionType(hwcId, HWC2::Composition::Client);
- continue;
- }
-
- layer->setPerFrameData(displayDevice);
- }
-
- if (hasWideColorDisplay) {
- ColorMode newColorMode;
- android_dataspace newDataSpace = HAL_DATASPACE_V0_SRGB;
-
- for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
- newDataSpace = bestTargetDataSpace(layer->getDataSpace(), newDataSpace,
- displayDevice->getHdrSupport());
- ALOGV("layer: %s, dataspace: %s (%#x), newDataSpace: %s (%#x)",
- layer->getName().string(), dataspaceDetails(layer->getDataSpace()).c_str(),
- layer->getDataSpace(), dataspaceDetails(newDataSpace).c_str(), newDataSpace);
- }
- newColorMode = pickColorMode(newDataSpace);
-
- setActiveColorModeInternal(displayDevice, newColorMode);
- }
- }
-
- mPreviousColorMatrix = colorMatrix;
- for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
- auto& displayDevice = mDisplays[displayId];
- for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
- auto hwcId = displayDevice->getHwcDisplayId();
- layer->getBE().compositionInfo.compositionType = layer->getCompositionType(hwcId);
- if (!layer->setHwcLayer(hwcId)) {
- ALOGV("Need to create HWCLayer for %s", layer->getName().string());
- }
- layer->getBE().compositionInfo.hwc.hwid = hwcId;
- getBE().mCompositionInfo.push_back(layer->getBE().compositionInfo);
- layer->getBE().compositionInfo.hwc.hwcLayer = nullptr;
- }
- }
-}
-
void SurfaceFlinger::handleMessageRefresh() {
ATRACE_CALL();
mRefreshPending = false;
+ nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
-
- beginFrame();
- for (auto compositionInfo : getBE().mCompositionInfo) {
- setUpHWComposer(compositionInfo);
- }
- prepareFrame();
+ preComposition(refreshStartTime);
+ rebuildLayerStacks();
+ setUpHWComposer();
doDebugFlashRegions();
doTracing("handleRefresh");
logLayerStats();
doComposition();
- postComposition();
-
- getBE().mCompositionInfo.clear();
+ postComposition(refreshStartTime);
mPreviousPresentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
@@ -1678,14 +1572,14 @@
}
}
-void SurfaceFlinger::preComposition()
+void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
{
ATRACE_CALL();
ALOGV("preComposition");
bool needExtraInvalidate = false;
mDrawingState.traverseInZOrder([&](Layer* layer) {
- if (layer->onPreComposition(mRefreshStartTime)) {
+ if (layer->onPreComposition(refreshStartTime)) {
needExtraInvalidate = true;
}
});
@@ -1754,7 +1648,7 @@
getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
}
-void SurfaceFlinger::postComposition()
+void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
{
ATRACE_CALL();
ALOGV("postComposition");
@@ -1786,11 +1680,11 @@
nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
- // We use the mRefreshStartTime which might be sampled a little later than
+ // We use the refreshStartTime which might be sampled a little later than
// when we started doing work for this frame, but that should be okay
// since updateCompositorTiming has snapping logic.
updateCompositorTiming(
- vsyncPhase, vsyncInterval, mRefreshStartTime, presentFenceTime);
+ vsyncPhase, vsyncInterval, refreshStartTime, presentFenceTime);
CompositorTiming compositorTiming;
{
std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
@@ -1888,21 +1782,17 @@
if (!drawRegion.isEmpty()) {
layersSortedByZ.add(layer);
} else {
- if (layer->hasHwcLayer(displayDevice->getHwcDisplayId())) {
- // Clear out the HWC layer if this layer was
- // previously visible, but no longer is
- hwcLayerDestroyed = layer->destroyHwcLayer(
- displayDevice->getHwcDisplayId());
- }
- }
- } else {
- if (layer->hasHwcLayer(displayDevice->getHwcDisplayId())) {
- // WM changes displayDevice->layerStack upon sleep/awake.
- // Here we make sure we delete the HWC layers even if
- // WM changed their layer stack.
+ // Clear out the HWC layer if this layer was
+ // previously visible, but no longer is
hwcLayerDestroyed = layer->destroyHwcLayer(
displayDevice->getHwcDisplayId());
}
+ } else {
+ // WM changes displayDevice->layerStack upon sleep/awake.
+ // Here we make sure we delete the HWC layers even if
+ // WM changed their layer stack.
+ hwcLayerDestroyed = layer->destroyHwcLayer(
+ displayDevice->getHwcDisplayId());
}
// If a layer is not going to get a release fence because
@@ -1997,123 +1887,9 @@
return HAL_DATASPACE_V0_SRGB;
}
-void SurfaceFlinger::configureSidebandComposition(const CompositionInfo& compositionInfo) const
-{
- HWC2::Error error;
- LOG_ALWAYS_FATAL_IF(compositionInfo.hwc.sidebandStream == nullptr,
- "CompositionType is sideband, but sideband stream is nullptr");
- error = (*compositionInfo.hwc.hwcLayer)
- ->setSidebandStream(compositionInfo.hwc.sidebandStream->handle());
- if (error != HWC2::Error::None) {
- ALOGE("[SF] Failed to set sideband stream %p: %s (%d)",
- compositionInfo.hwc.sidebandStream->handle(), to_string(error).c_str(),
- static_cast<int32_t>(error));
- }
-}
-
-void SurfaceFlinger::configureHwcCommonData(const CompositionInfo& compositionInfo) const
-{
- HWC2::Error error;
-
- if (!compositionInfo.hwc.skipGeometry) {
- error = (*compositionInfo.hwc.hwcLayer)->setBlendMode(compositionInfo.hwc.blendMode);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set blend mode %s:"
- " %s (%d)",
- to_string(compositionInfo.hwc.blendMode).c_str(), to_string(error).c_str(),
- static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setDisplayFrame(compositionInfo.hwc.displayFrame);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set the display frame [%d, %d, %d, %d] %s (%d)",
- compositionInfo.hwc.displayFrame.left,
- compositionInfo.hwc.displayFrame.right,
- compositionInfo.hwc.displayFrame.top,
- compositionInfo.hwc.displayFrame.bottom,
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setSourceCrop(compositionInfo.hwc.sourceCrop);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: %s (%d)",
- compositionInfo.hwc.sourceCrop.left,
- compositionInfo.hwc.sourceCrop.right,
- compositionInfo.hwc.sourceCrop.top,
- compositionInfo.hwc.sourceCrop.bottom,
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setPlaneAlpha(compositionInfo.hwc.alpha);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set plane alpha %.3f: "
- "%s (%d)",
- compositionInfo.hwc.alpha,
- to_string(error).c_str(), static_cast<int32_t>(error));
-
-
- error = (*compositionInfo.hwc.hwcLayer)->setZOrder(compositionInfo.hwc.z);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set Z %u: %s (%d)",
- compositionInfo.hwc.z,
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)
- ->setInfo(compositionInfo.hwc.type, compositionInfo.hwc.appId);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set info (%d)",
- static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setTransform(compositionInfo.hwc.transform);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set transform %s: "
- "%s (%d)",
- to_string(compositionInfo.hwc.transform).c_str(), to_string(error).c_str(),
- static_cast<int32_t>(error));
- }
-
- error = (*compositionInfo.hwc.hwcLayer)->setCompositionType(compositionInfo.compositionType);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set composition type: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setDataspace(compositionInfo.hwc.dataspace);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set dataspace: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setHdrMetadata(compositionInfo.hwc.hdrMetadata);
- ALOGE_IF(error != HWC2::Error::None && error != HWC2::Error::Unsupported,
- "[SF] Failed to set hdrMetadata: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setColor(compositionInfo.hwc.color);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set color: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setVisibleRegion(compositionInfo.hwc.visibleRegion);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set visible region: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-}
-
-void SurfaceFlinger::configureDeviceComposition(const CompositionInfo& compositionInfo) const
-{
- HWC2::Error error;
-
- error = (*compositionInfo.hwc.hwcLayer)->setSurfaceDamage(compositionInfo.hwc.surfaceDamage);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set surface damage: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-
- error = (*compositionInfo.hwc.hwcLayer)->setBuffer(compositionInfo.mBufferSlot,
- compositionInfo.mBuffer, compositionInfo.hwc.fence);
- ALOGE_IF(error != HWC2::Error::None,
- "[SF] Failed to set buffer: %s (%d)",
- to_string(error).c_str(), static_cast<int32_t>(error));
-}
-
-void SurfaceFlinger::beginFrame()
-{
- mRefreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
+void SurfaceFlinger::setUpHWComposer() {
+ ATRACE_CALL();
+ ALOGV("setUpHWComposer");
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
@@ -2143,10 +1919,85 @@
mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
}
}
-}
-void SurfaceFlinger::prepareFrame()
-{
+ // build the h/w work list
+ if (CC_UNLIKELY(mGeometryInvalid)) {
+ mGeometryInvalid = false;
+ for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
+ sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
+ const auto hwcId = displayDevice->getHwcDisplayId();
+ if (hwcId >= 0) {
+ const Vector<sp<Layer>>& currentLayers(
+ displayDevice->getVisibleLayersSortedByZ());
+ for (size_t i = 0; i < currentLayers.size(); i++) {
+ const auto& layer = currentLayers[i];
+ if (!layer->hasHwcLayer(hwcId)) {
+ if (!layer->createHwcLayer(getBE().mHwc.get(), hwcId)) {
+ layer->forceClientComposition(hwcId);
+ continue;
+ }
+ }
+
+ layer->setGeometry(displayDevice, i);
+ if (mDebugDisableHWC || mDebugRegion) {
+ layer->forceClientComposition(hwcId);
+ }
+ }
+ }
+ }
+ }
+
+
+ mat4 colorMatrix = mColorMatrix * computeSaturationMatrix() * mDaltonizer();
+
+ // Set the per-frame data
+ for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
+ auto& displayDevice = mDisplays[displayId];
+ const auto hwcId = displayDevice->getHwcDisplayId();
+
+ if (hwcId < 0) {
+ continue;
+ }
+ if (colorMatrix != mPreviousColorMatrix) {
+ status_t result = getBE().mHwc->setColorTransform(hwcId, colorMatrix);
+ ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
+ "display %zd: %d", displayId, result);
+ }
+ for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
+ if ((layer->getDataSpace() == HAL_DATASPACE_BT2020_PQ ||
+ layer->getDataSpace() == HAL_DATASPACE_BT2020_ITU_PQ) &&
+ !displayDevice->getHdrSupport()) {
+ layer->forceClientComposition(hwcId);
+ }
+
+ if (layer->getForceClientComposition(hwcId)) {
+ ALOGV("[%s] Requesting Client composition", layer->getName().string());
+ layer->setCompositionType(hwcId, HWC2::Composition::Client);
+ continue;
+ }
+
+ layer->setPerFrameData(displayDevice);
+ }
+
+ if (hasWideColorDisplay) {
+ ColorMode newColorMode;
+ android_dataspace newDataSpace = HAL_DATASPACE_V0_SRGB;
+
+ for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
+ newDataSpace = bestTargetDataSpace(layer->getDataSpace(), newDataSpace,
+ displayDevice->getHdrSupport());
+ ALOGV("layer: %s, dataspace: %s (%#x), newDataSpace: %s (%#x)",
+ layer->getName().string(), dataspaceDetails(layer->getDataSpace()).c_str(),
+ layer->getDataSpace(), dataspaceDetails(newDataSpace).c_str(), newDataSpace);
+ }
+ newColorMode = pickColorMode(newDataSpace);
+
+ setActiveColorModeInternal(displayDevice, newColorMode);
+ }
+ }
+
+ mPreviousColorMatrix = colorMatrix;
+
for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
auto& displayDevice = mDisplays[displayId];
if (!displayDevice->isDisplayOn()) {
@@ -2159,32 +2010,6 @@
}
}
-void SurfaceFlinger::setUpHWComposer(const CompositionInfo& compositionInfo) {
- ATRACE_CALL();
- ALOGV("setUpHWComposer");
-
- switch (compositionInfo.compositionType)
- {
- case HWC2::Composition::Invalid:
- case HWC2::Composition::Client:
- case HWC2::Composition::Cursor:
- break;
-
- case HWC2::Composition::Sideband:
- configureSidebandComposition(compositionInfo);
- break;
-
- case HWC2::Composition::SolidColor:
- configureHwcCommonData(compositionInfo);
- break;
-
- case HWC2::Composition::Device:
- configureHwcCommonData(compositionInfo);
- configureDeviceComposition(compositionInfo);
- break;
- }
-}
-
void SurfaceFlinger::doComposition() {
ATRACE_CALL();
ALOGV("doComposition");
@@ -3002,7 +2827,6 @@
}
bool hasClientComposition = getBE().mHwc->hasClientComposition(hwcId);
- ATRACE_INT("hasClientComposition", hasClientComposition);
if (hasClientComposition) {
ALOGV("hasClientComposition");
@@ -5113,6 +4937,7 @@
}; // namespace android
+
#if defined(__gl_h_)
#error "don't include gl/gl.h in this file"
#endif
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 77efa54..99bbb13 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -214,8 +214,6 @@
// use to differentiate callbacks from different hardware composer
// instances. Each hardware composer instance gets a different sequence id.
int32_t mComposerSequenceId;
-
- std::vector<CompositionInfo> mCompositionInfo;
};
@@ -628,8 +626,8 @@
void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
Region& dirtyRegion, Region& opaqueRegion);
- void preComposition();
- void postComposition();
+ void preComposition(nsecs_t refreshStartTime);
+ void postComposition(nsecs_t refreshStartTime);
void updateCompositorTiming(
nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
std::shared_ptr<FenceTime>& presentFenceTime);
@@ -646,19 +644,7 @@
mat4 computeSaturationMatrix() const;
- void calculateWorkingSet();
- /*
- * beginFrame - This function handles any pre-frame processing that needs to be
- * prior to any CompositionInfo handling and is not dependent on data in
- * CompositionInfo
- */
- void beginFrame();
- /* prepareFrame - This function will call into the DisplayDevice to prepare a
- * frame after CompositionInfo has been programmed. This provides a mechanism
- * to prepare the hardware composer
- */
- void prepareFrame();
- void setUpHWComposer(const CompositionInfo& compositionInfo);
+ void setUpHWComposer();
void doComposition();
void doDebugFlashRegions();
void doTracing(const char* where);
@@ -768,11 +754,6 @@
// access must be protected by mInvalidateLock
volatile int32_t mRepaintEverything;
- // helper methods
- void configureHwcCommonData(const CompositionInfo& compositionInfo) const;
- void configureDeviceComposition(const CompositionInfo& compositionInfo) const;
- void configureSidebandComposition(const CompositionInfo& compositionInfo) const;
-
// constant members (no synchronization needed for access)
nsecs_t mBootTime;
bool mGpuToCpuSupported;
@@ -840,7 +821,6 @@
Mutex mHWVsyncLock;
bool mPrimaryHWVsyncEnabled;
bool mHWVsyncAvailable;
- nsecs_t mRefreshStartTime;
std::atomic<bool> mRefreshPending{false};