Merge "Convert tool type to enum class"
diff --git a/cmds/bugreportz/main.cpp b/cmds/bugreportz/main.cpp
index cd2652c..790556c 100644
--- a/cmds/bugreportz/main.cpp
+++ b/cmds/bugreportz/main.cpp
@@ -75,6 +75,23 @@
return EXIT_FAILURE;
}
+ // Wait a little while for dumpstatez to stop if it is running
+ bool dumpstate_running = false;
+ for (int i = 0; i < 20; i++) {
+ char buf[PROPERTY_VALUE_MAX];
+ property_get("init.svc.dumpstatez", buf, "");
+ dumpstate_running = strcmp(buf, "running") == 0;
+
+ if (!dumpstate_running) break;
+
+ sleep(1);
+ }
+
+ if (dumpstate_running) {
+ fprintf(stderr, "FAIL:dumpstatez service is already running\n");
+ return EXIT_FAILURE;
+ }
+
// TODO: code below was copy-and-pasted from bugreport.cpp (except by the
// timeout value);
// should be reused instead.
diff --git a/cmds/cmd/fuzzer/Android.bp b/cmds/cmd/fuzzer/Android.bp
index a65f6de..faf461a 100644
--- a/cmds/cmd/fuzzer/Android.bp
+++ b/cmds/cmd/fuzzer/Android.bp
@@ -42,5 +42,13 @@
"android-media-fuzzing-reports@google.com",
],
componentid: 155276,
+ hotlists: [
+ "4593311",
+ ],
+ description: "The fuzzer targets the APIs of libcmd",
+ vector: "local_no_privileges_required",
+ service_privilege: "constrained",
+ users: "multi_user",
+ fuzzed_code_usage: "shipped",
},
}
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp
index baf8e42..2a7089e 100644
--- a/cmds/dumpstate/dumpstate.cpp
+++ b/cmds/dumpstate/dumpstate.cpp
@@ -2593,7 +2593,11 @@
}
static void register_sig_handler() {
- signal(SIGPIPE, SIG_IGN);
+ signal(SIGPIPE, [](int) {
+ MYLOGE("Connection with client lost, canceling.");
+ ds.Cancel();
+ abort();
+ });
}
bool Dumpstate::FinishZipFile() {
diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING
index 07b38d7..41707d4 100644
--- a/libs/binder/TEST_MAPPING
+++ b/libs/binder/TEST_MAPPING
@@ -79,6 +79,12 @@
},
{
"name": "rustBinderSerializationTest"
+ },
+ {
+ "name": "libbinder_ndk_bindgen_test"
+ },
+ {
+ "name": "libbinder_rpc_unstable_bindgen_test"
}
],
"presubmit-large": [
diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp
index b391337..1969496 100644
--- a/libs/gui/LayerState.cpp
+++ b/libs/gui/LayerState.cpp
@@ -190,8 +190,8 @@
}
SAFE_PARCEL(output.writeParcelable, trustedPresentationThresholds);
SAFE_PARCEL(output.writeParcelable, trustedPresentationListener);
- SAFE_PARCEL(output.writeFloat, currentSdrHdrRatio);
- SAFE_PARCEL(output.writeFloat, desiredSdrHdrRatio);
+ SAFE_PARCEL(output.writeFloat, currentHdrSdrRatio);
+ SAFE_PARCEL(output.writeFloat, desiredHdrSdrRatio);
SAFE_PARCEL(output.writeInt32, static_cast<int32_t>(cachingHint))
return NO_ERROR;
}
@@ -335,9 +335,9 @@
SAFE_PARCEL(input.readParcelable, &trustedPresentationListener);
SAFE_PARCEL(input.readFloat, &tmpFloat);
- currentSdrHdrRatio = tmpFloat;
+ currentHdrSdrRatio = tmpFloat;
SAFE_PARCEL(input.readFloat, &tmpFloat);
- desiredSdrHdrRatio = tmpFloat;
+ desiredHdrSdrRatio = tmpFloat;
int32_t tmpInt32;
SAFE_PARCEL(input.readInt32, &tmpInt32);
@@ -592,8 +592,8 @@
}
if (other.what & eExtendedRangeBrightnessChanged) {
what |= eExtendedRangeBrightnessChanged;
- desiredSdrHdrRatio = other.desiredSdrHdrRatio;
- currentSdrHdrRatio = other.currentSdrHdrRatio;
+ desiredHdrSdrRatio = other.desiredHdrSdrRatio;
+ currentHdrSdrRatio = other.currentHdrSdrRatio;
}
if (other.what & eCachingHintChanged) {
what |= eCachingHintChanged;
@@ -747,8 +747,8 @@
CHECK_DIFF(diff, eCropChanged, other, crop);
if (other.what & eBufferChanged) diff |= eBufferChanged;
CHECK_DIFF(diff, eDataspaceChanged, other, dataspace);
- CHECK_DIFF2(diff, eExtendedRangeBrightnessChanged, other, currentSdrHdrRatio,
- desiredSdrHdrRatio);
+ CHECK_DIFF2(diff, eExtendedRangeBrightnessChanged, other, currentHdrSdrRatio,
+ desiredHdrSdrRatio);
CHECK_DIFF(diff, eCachingHintChanged, other, cachingHint);
CHECK_DIFF(diff, eHdrMetadataChanged, other, hdrMetadata);
if (other.what & eSurfaceDamageRegionChanged &&
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index 2f5830d..7700aa4 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -1723,8 +1723,8 @@
return *this;
}
s->what |= layer_state_t::eExtendedRangeBrightnessChanged;
- s->currentSdrHdrRatio = currentBufferRatio;
- s->desiredSdrHdrRatio = desiredRatio;
+ s->currentHdrSdrRatio = currentBufferRatio;
+ s->desiredHdrSdrRatio = desiredRatio;
registerSurfaceControlForCallback(sc);
return *this;
diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h
index 6e3be5c..5c88a07 100644
--- a/libs/gui/include/gui/LayerState.h
+++ b/libs/gui/include/gui/LayerState.h
@@ -389,8 +389,8 @@
gui::DropInputMode dropInputMode;
bool dimmingEnabled;
- float currentSdrHdrRatio = 1.f;
- float desiredSdrHdrRatio = 1.f;
+ float currentHdrSdrRatio = 1.f;
+ float desiredHdrSdrRatio = 1.f;
gui::CachingHint cachingHint = gui::CachingHint::Enabled;
diff --git a/libs/jpegrecoverymap/Android.bp b/libs/jpegrecoverymap/Android.bp
index b470f35..a1b0e19 100644
--- a/libs/jpegrecoverymap/Android.bp
+++ b/libs/jpegrecoverymap/Android.bp
@@ -24,7 +24,7 @@
cc_library {
name: "libjpegrecoverymap",
host_supported: true,
-
+ vendor_available: true,
export_include_dirs: ["include"],
local_include_dirs: ["include"],
@@ -49,10 +49,12 @@
cc_library {
name: "libjpegencoder",
host_supported: true,
+ vendor_available: true,
shared_libs: [
"libjpeg",
"liblog",
+ "libutils",
],
export_include_dirs: ["include"],
@@ -65,10 +67,12 @@
cc_library {
name: "libjpegdecoder",
host_supported: true,
+ vendor_available: true,
shared_libs: [
"libjpeg",
"liblog",
+ "libutils",
],
export_include_dirs: ["include"],
diff --git a/libs/ui/Gralloc5.cpp b/libs/ui/Gralloc5.cpp
index 514b45f..2106839 100644
--- a/libs/ui/Gralloc5.cpp
+++ b/libs/ui/Gralloc5.cpp
@@ -352,14 +352,12 @@
}
}
{
- (void)stride;
- // TODO(b/261856851): Add StandardMetadataType::STRIDE && enable this
- // auto value = getStandardMetadata<StandardMetadataType::STRIDE>(mMapper,
- // bufferHandle); if (static_cast<BufferUsage>(usage) != value) {
- // ALOGW("Layer count didn't match, expected %" PRIu64 " got %" PRId64, usage,
- // static_cast<int64_t>(value.value_or(BufferUsage::CPU_READ_NEVER)));
- // return BAD_VALUE;
- // }
+ auto value = getStandardMetadata<StandardMetadataType::STRIDE>(mMapper, bufferHandle);
+ if (stride != value) {
+ ALOGW("Stride didn't match, expected %" PRIu32 " got %" PRId32, stride,
+ value.value_or(-1));
+ return BAD_VALUE;
+ }
}
return OK;
}
diff --git a/services/gpuservice/vts/Android.bp b/services/gpuservice/vts/Android.bp
index f4ea440..a24822a 100644
--- a/services/gpuservice/vts/Android.bp
+++ b/services/gpuservice/vts/Android.bp
@@ -21,7 +21,6 @@
srcs: ["src/**/*.java"],
libs: [
"tradefed",
- "vts-core-tradefed-harness",
"compatibility-host-util",
],
test_suites: [
diff --git a/services/gpuservice/vts/src/com/android/tests/gpuservice/GpuWorkTracepointTest.java b/services/gpuservice/vts/src/com/android/tests/gpuservice/GpuWorkTracepointTest.java
index 290a646..6c16335 100644
--- a/services/gpuservice/vts/src/com/android/tests/gpuservice/GpuWorkTracepointTest.java
+++ b/services/gpuservice/vts/src/com/android/tests/gpuservice/GpuWorkTracepointTest.java
@@ -27,7 +27,7 @@
import com.android.tradefed.util.CommandStatus;
import com.android.compatibility.common.util.PropertyUtil;
-import com.android.compatibility.common.util.GmsTest;
+import com.android.compatibility.common.util.VsrTest;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -62,7 +62,7 @@
commandResult.getStatus(), CommandStatus.SUCCESS);
}
- @GmsTest(requirement = "VSR-3.3-004")
+ @VsrTest(requirements={"VSR-3.3-004"})
@RestrictedBuildTest
@Test
public void testGpuWorkPeriodTracepointFormat() throws Exception {
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h
index eae5871..35ca3a5 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h
@@ -210,8 +210,8 @@
// The dimming flag
bool dimmingEnabled{true};
- float currentSdrHdrRatio = 1.f;
- float desiredSdrHdrRatio = 1.f;
+ float currentHdrSdrRatio = 1.f;
+ float desiredHdrSdrRatio = 1.f;
gui::CachingHint cachingHint = gui::CachingHint::Enabled;
virtual ~LayerFECompositionState();
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
index d5c488e..ce2b96f 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
@@ -247,6 +247,10 @@
ui::Dataspace getDataspace() const { return mOutputDataspace.get(); }
+ float getHdrSdrRatio() const {
+ return getOutputLayer()->getLayerFE().getCompositionState()->currentHdrSdrRatio;
+ };
+
wp<GraphicBuffer> getBuffer() const { return mBuffer.get(); }
bool isProtected() const { return mIsProtected.get(); }
diff --git a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
index 615d04b..426cc57 100644
--- a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
@@ -121,9 +121,9 @@
dumpVal(out, "dataspace", toString(dataspace), dataspace);
dumpVal(out, "hdr metadata types", hdrMetadata.validTypes);
dumpVal(out, "dimming enabled", dimmingEnabled);
- if (currentSdrHdrRatio > 1.01f || desiredSdrHdrRatio > 1.01f) {
- dumpVal(out, "current sdr/hdr ratio", currentSdrHdrRatio);
- dumpVal(out, "desired sdr/hdr ratio", desiredSdrHdrRatio);
+ if (currentHdrSdrRatio > 1.01f || desiredHdrSdrRatio > 1.01f) {
+ dumpVal(out, "current hdr/sdr ratio", currentHdrSdrRatio);
+ dumpVal(out, "desired hdr/sdr ratio", desiredHdrSdrRatio);
}
dumpVal(out, "colorTransform", colorTransform);
dumpVal(out, "caching hint", toString(cachingHint));
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 1b86cd3..0ac0ecb 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -344,8 +344,8 @@
// RANGE_EXTENDED can "self-promote" to HDR, but is still rendered for a particular
// range that we may need to re-adjust to the current display conditions
if ((state.dataspace & HAL_DATASPACE_RANGE_MASK) == HAL_DATASPACE_RANGE_EXTENDED &&
- layerFEState->currentSdrHdrRatio > 1.01f) {
- layerBrightnessNits *= layerFEState->currentSdrHdrRatio;
+ layerFEState->currentHdrSdrRatio > 1.01f) {
+ layerBrightnessNits *= layerFEState->currentHdrSdrRatio;
}
state.dimmingRatio =
std::clamp(layerBrightnessNits / getOutput().getState().displayBrightnessNits, 0.f,
diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
index a00ce57..8ced0ac 100644
--- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
@@ -378,6 +378,10 @@
// to avoid flickering/color differences.
return true;
}
+ // TODO(b/274804887): temp fix of overdimming issue, skip caching if hsdr/sdr ratio > 1.01f
+ if (layer.getState()->getHdrSdrRatio() > 1.01f) {
+ return true;
+ }
return false;
});
}
diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
index ca5ba69..bd030d0 100644
--- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp
@@ -662,6 +662,26 @@
EXPECT_FALSE(cachedSet.requiresHolePunch());
}
+TEST_F(CachedSetTest, holePunch_requiresNonHdrWithExtendedBrightness) {
+ const auto dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_DCI_P3 |
+ ui::Dataspace::TRANSFER_SRGB |
+ ui::Dataspace::RANGE_EXTENDED);
+ mTestLayers[0]->outputLayerCompositionState.dataspace = dataspace;
+ mTestLayers[0]->layerFECompositionState.currentHdrSdrRatio = 5.f;
+ mTestLayers[0]->layerState->update(&mTestLayers[0]->outputLayer);
+
+ CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
+ auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
+ layerFECompositionState.buffer = sp<GraphicBuffer>::make();
+ layerFECompositionState.blendMode = hal::BlendMode::NONE;
+ sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE;
+
+ CachedSet cachedSet(layer);
+ EXPECT_CALL(*layerFE, hasRoundedCorners()).WillRepeatedly(Return(true));
+
+ EXPECT_FALSE(cachedSet.requiresHolePunch());
+}
+
TEST_F(CachedSetTest, holePunch_requiresNoBlending) {
CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();
auto& layerFECompositionState = mTestLayers[0]->layerFECompositionState;
diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
index bdd4427..babcbe7 100644
--- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
+++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp
@@ -720,8 +720,8 @@
snapshot.sidebandStream = requested.sidebandStream;
snapshot.transparentRegionHint = requested.transparentRegion;
snapshot.color.rgb = requested.getColor().rgb;
- snapshot.currentSdrHdrRatio = requested.currentSdrHdrRatio;
- snapshot.desiredSdrHdrRatio = requested.desiredSdrHdrRatio;
+ snapshot.currentHdrSdrRatio = requested.currentHdrSdrRatio;
+ snapshot.desiredHdrSdrRatio = requested.desiredHdrSdrRatio;
}
if (snapshot.isHiddenByPolicyFromParent &&
diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
index a5fdaf4..1f670c8 100644
--- a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
+++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
@@ -100,8 +100,8 @@
layerStack = ui::DEFAULT_LAYER_STACK;
transformToDisplayInverse = false;
dataspace = ui::Dataspace::UNKNOWN;
- desiredSdrHdrRatio = 1.f;
- currentSdrHdrRatio = 1.f;
+ desiredHdrSdrRatio = 1.f;
+ currentHdrSdrRatio = 1.f;
dataspaceRequested = false;
hdrMetadata.validTypes = 0;
surfaceDamageRegion = Region::INVALID_REGION;
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index c1920ba..755e585 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -643,8 +643,8 @@
snapshot->surfaceDamage = surfaceDamageRegion;
snapshot->hasProtectedContent = isProtected();
snapshot->dimmingEnabled = isDimmingEnabled();
- snapshot->currentSdrHdrRatio = getCurrentSdrHdrRatio();
- snapshot->desiredSdrHdrRatio = getDesiredSdrHdrRatio();
+ snapshot->currentHdrSdrRatio = getCurrentHdrSdrRatio();
+ snapshot->desiredHdrSdrRatio = getDesiredHdrSdrRatio();
snapshot->cachingHint = getCachingHint();
const bool usesRoundedCorners = hasRoundedCorners();
@@ -3145,11 +3145,11 @@
}
bool Layer::setExtendedRangeBrightness(float currentBufferRatio, float desiredRatio) {
- if (mDrawingState.currentSdrHdrRatio == currentBufferRatio &&
- mDrawingState.desiredSdrHdrRatio == desiredRatio)
+ if (mDrawingState.currentHdrSdrRatio == currentBufferRatio &&
+ mDrawingState.desiredHdrSdrRatio == desiredRatio)
return false;
- mDrawingState.currentSdrHdrRatio = currentBufferRatio;
- mDrawingState.desiredSdrHdrRatio = desiredRatio;
+ mDrawingState.currentHdrSdrRatio = currentBufferRatio;
+ mDrawingState.desiredHdrSdrRatio = desiredRatio;
mDrawingState.modified = true;
setTransactionFlags(eTransactionNeeded);
return true;
@@ -3404,8 +3404,8 @@
if (lastDataspace != mBufferInfo.mDataspace) {
mFlinger->mHdrLayerInfoChanged = true;
}
- if (mBufferInfo.mDesiredSdrHdrRatio != mDrawingState.desiredSdrHdrRatio) {
- mBufferInfo.mDesiredSdrHdrRatio = mDrawingState.desiredSdrHdrRatio;
+ if (mBufferInfo.mDesiredHdrSdrRatio != mDrawingState.desiredHdrSdrRatio) {
+ mBufferInfo.mDesiredHdrSdrRatio = mDrawingState.desiredHdrSdrRatio;
mFlinger->mHdrLayerInfoChanged = true;
}
mBufferInfo.mCrop = computeBufferCrop(mDrawingState);
@@ -3691,9 +3691,9 @@
}
if (s.what & layer_state_t::eExtendedRangeBrightnessChanged) {
- if (mDrawingState.currentSdrHdrRatio != s.currentSdrHdrRatio ||
- mDrawingState.desiredSdrHdrRatio != s.desiredSdrHdrRatio) {
- ALOGV("%s: false [eDimmingEnabledChanged changed]", __func__);
+ if (mDrawingState.currentHdrSdrRatio != s.currentHdrSdrRatio ||
+ mDrawingState.desiredHdrSdrRatio != s.desiredHdrSdrRatio) {
+ ALOGV("%s: false [eExtendedRangeBrightnessChanged changed]", __func__);
return false;
}
}
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 552ea37..1af648a 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -225,8 +225,8 @@
gui::DropInputMode dropInputMode;
bool autoRefresh = false;
bool dimmingEnabled = true;
- float currentSdrHdrRatio = 1.f;
- float desiredSdrHdrRatio = 1.f;
+ float currentHdrSdrRatio = 1.f;
+ float desiredHdrSdrRatio = 1.f;
gui::CachingHint cachingHint = gui::CachingHint::Enabled;
int64_t latchedVsyncId = 0;
};
@@ -296,8 +296,8 @@
virtual bool hasColorTransform() const;
virtual bool isColorSpaceAgnostic() const { return mDrawingState.colorSpaceAgnostic; }
virtual bool isDimmingEnabled() const { return getDrawingState().dimmingEnabled; }
- float getDesiredSdrHdrRatio() const { return getDrawingState().desiredSdrHdrRatio; }
- float getCurrentSdrHdrRatio() const { return getDrawingState().currentSdrHdrRatio; }
+ float getDesiredHdrSdrRatio() const { return getDrawingState().desiredHdrSdrRatio; }
+ float getCurrentHdrSdrRatio() const { return getDrawingState().currentHdrSdrRatio; }
gui::CachingHint getCachingHint() const { return getDrawingState().cachingHint; }
bool setTransform(uint32_t /*transform*/);
@@ -517,7 +517,7 @@
uint64_t mFrameNumber;
bool mFrameLatencyNeeded{false};
- float mDesiredSdrHdrRatio = 1.f;
+ float mDesiredHdrSdrRatio = 1.f;
};
BufferInfo mBufferInfo;
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp
index f18dfdc..7f8d394 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.cpp
+++ b/services/surfaceflinger/Scheduler/Scheduler.cpp
@@ -109,7 +109,6 @@
void Scheduler::setPacesetterDisplay(std::optional<PhysicalDisplayId> pacesetterIdOpt) {
demotePacesetterDisplay();
- std::scoped_lock lock(mDisplayLock);
promotePacesetterDisplay(pacesetterIdOpt);
}
@@ -123,26 +122,34 @@
std::shared_ptr<VsyncSchedule> vsyncSchedule) {
demotePacesetterDisplay();
- std::scoped_lock lock(mDisplayLock);
- mRefreshRateSelectors.emplace_or_replace(displayId, std::move(selectorPtr));
- mVsyncSchedules.emplace_or_replace(displayId, std::move(vsyncSchedule));
+ std::shared_ptr<VsyncSchedule> pacesetterVsyncSchedule;
+ {
+ std::scoped_lock lock(mDisplayLock);
+ mRefreshRateSelectors.emplace_or_replace(displayId, std::move(selectorPtr));
+ mVsyncSchedules.emplace_or_replace(displayId, std::move(vsyncSchedule));
- promotePacesetterDisplay();
+ pacesetterVsyncSchedule = promotePacesetterDisplayLocked();
+ }
+ applyNewVsyncSchedule(std::move(pacesetterVsyncSchedule));
}
void Scheduler::unregisterDisplay(PhysicalDisplayId displayId) {
demotePacesetterDisplay();
- std::scoped_lock lock(mDisplayLock);
- mRefreshRateSelectors.erase(displayId);
- mVsyncSchedules.erase(displayId);
+ std::shared_ptr<VsyncSchedule> pacesetterVsyncSchedule;
+ {
+ std::scoped_lock lock(mDisplayLock);
+ mRefreshRateSelectors.erase(displayId);
+ mVsyncSchedules.erase(displayId);
- // Do not allow removing the final display. Code in the scheduler expects
- // there to be at least one display. (This may be relaxed in the future with
- // headless virtual display.)
- LOG_ALWAYS_FATAL_IF(mRefreshRateSelectors.empty(), "Cannot unregister all displays!");
+ // Do not allow removing the final display. Code in the scheduler expects
+ // there to be at least one display. (This may be relaxed in the future with
+ // headless virtual display.)
+ LOG_ALWAYS_FATAL_IF(mRefreshRateSelectors.empty(), "Cannot unregister all displays!");
- promotePacesetterDisplay();
+ pacesetterVsyncSchedule = promotePacesetterDisplayLocked();
+ }
+ applyNewVsyncSchedule(std::move(pacesetterVsyncSchedule));
}
void Scheduler::run() {
@@ -678,6 +685,18 @@
}
void Scheduler::promotePacesetterDisplay(std::optional<PhysicalDisplayId> pacesetterIdOpt) {
+ std::shared_ptr<VsyncSchedule> pacesetterVsyncSchedule;
+
+ {
+ std::scoped_lock lock(mDisplayLock);
+ pacesetterVsyncSchedule = promotePacesetterDisplayLocked(pacesetterIdOpt);
+ }
+
+ applyNewVsyncSchedule(std::move(pacesetterVsyncSchedule));
+}
+
+std::shared_ptr<VsyncSchedule> Scheduler::promotePacesetterDisplayLocked(
+ std::optional<PhysicalDisplayId> pacesetterIdOpt) {
// TODO(b/241286431): Choose the pacesetter display.
mPacesetterDisplayId = pacesetterIdOpt.value_or(mRefreshRateSelectors.begin()->first);
ALOGI("Display %s is the pacesetter", to_string(*mPacesetterDisplayId).c_str());
@@ -697,14 +716,22 @@
vsyncSchedule->startPeriodTransition(mSchedulerCallback, refreshRate.getPeriod(),
true /* force */);
}
+ return vsyncSchedule;
+}
+void Scheduler::applyNewVsyncSchedule(std::shared_ptr<VsyncSchedule> vsyncSchedule) {
onNewVsyncSchedule(vsyncSchedule->getDispatch());
+ std::vector<android::EventThread*> threads;
{
std::lock_guard<std::mutex> lock(mConnectionsLock);
+ threads.reserve(mConnections.size());
for (auto& [_, connection] : mConnections) {
- connection.thread->onNewVsyncSchedule(vsyncSchedule);
+ threads.push_back(connection.thread.get());
}
}
+ for (auto* thread : threads) {
+ thread->onNewVsyncSchedule(vsyncSchedule);
+ }
}
void Scheduler::demotePacesetterDisplay() {
diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h
index 74547d5..3423652 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.h
+++ b/services/surfaceflinger/Scheduler/Scheduler.h
@@ -321,7 +321,18 @@
// Chooses a pacesetter among the registered displays, unless `pacesetterIdOpt` is specified.
// The new `mPacesetterDisplayId` is never `std::nullopt`.
void promotePacesetterDisplay(std::optional<PhysicalDisplayId> pacesetterIdOpt = std::nullopt)
+ REQUIRES(kMainThreadContext) EXCLUDES(mDisplayLock);
+
+ // Changes to the displays (e.g. registering and unregistering) must be made
+ // while mDisplayLock is locked, and the new pacesetter then must be promoted while
+ // mDisplayLock is still locked. However, a new pacesetter means that
+ // MessageQueue and EventThread need to use the new pacesetter's
+ // VsyncSchedule, and this must happen while mDisplayLock is *not* locked,
+ // or else we may deadlock with EventThread.
+ std::shared_ptr<VsyncSchedule> promotePacesetterDisplayLocked(
+ std::optional<PhysicalDisplayId> pacesetterIdOpt = std::nullopt)
REQUIRES(kMainThreadContext, mDisplayLock);
+ void applyNewVsyncSchedule(std::shared_ptr<VsyncSchedule>) EXCLUDES(mDisplayLock);
// Blocks until the pacesetter's idle timer thread exits. `mDisplayLock` must not be locked by
// the caller on the main thread to avoid deadlock, since the timer thread locks it before exit.
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 076c683..a271083 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2532,8 +2532,6 @@
}
updateCursorAsync();
- updateInputFlinger();
-
if (mLayerTracingEnabled && !mLayerTracing.flagIsSet(LayerTracing::TRACE_COMPOSITION)) {
// This will block and tracing should only be enabled for debugging.
addToLayerTracing(mVisibleRegionsDirty, frameTime.ns(), vsyncId.value);
@@ -2763,7 +2761,7 @@
// RANGE_EXTENDED layers may identify themselves as being "HDR" via a desired sdr/hdr ratio
if ((snapshot.dataspace & (int32_t)Dataspace::RANGE_MASK) ==
(int32_t)Dataspace::RANGE_EXTENDED &&
- snapshot.desiredSdrHdrRatio > 1.01f) {
+ snapshot.desiredHdrSdrRatio > 1.01f) {
return true;
}
return false;
@@ -2863,6 +2861,11 @@
layer->releasePendingBuffer(presentTime.ns());
}
+ mTransactionCallbackInvoker.addPresentFence(std::move(presentFence));
+ mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
+ mTransactionCallbackInvoker.clearCompletedTransactions();
+ updateInputFlinger();
+
std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>
hdrInfoListeners;
bool haveNewListeners = false;
@@ -2900,11 +2903,9 @@
const auto* outputLayer =
compositionDisplay->getOutputLayerForLayer(layerFe);
if (outputLayer) {
- // TODO(b/267350616): Rename SdrHdrRatio -> HdrSdrRatio
- // everywhere
- const float desiredHdrSdrRatio = snapshot.desiredSdrHdrRatio <= 1.f
+ const float desiredHdrSdrRatio = snapshot.desiredHdrSdrRatio <= 1.f
? std::numeric_limits<float>::infinity()
- : snapshot.desiredSdrHdrRatio;
+ : snapshot.desiredHdrSdrRatio;
info.mergeDesiredRatio(desiredHdrSdrRatio);
info.numberOfHdrLayers++;
const auto displayFrame = outputLayer->getState().displayFrame;
@@ -2924,10 +2925,6 @@
mHdrLayerInfoChanged = false;
- mTransactionCallbackInvoker.addPresentFence(std::move(presentFence));
- mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
- mTransactionCallbackInvoker.clearCompletedTransactions();
-
mTimeStats->incrementTotalFrames();
mTimeStats->setPresentFenceGlobal(presentFenceTime);
@@ -4962,7 +4959,7 @@
if (layer->setDimmingEnabled(s.dimmingEnabled)) flags |= eTraversalNeeded;
}
if (what & layer_state_t::eExtendedRangeBrightnessChanged) {
- if (layer->setExtendedRangeBrightness(s.currentSdrHdrRatio, s.desiredSdrHdrRatio)) {
+ if (layer->setExtendedRangeBrightness(s.currentHdrSdrRatio, s.desiredHdrSdrRatio)) {
flags |= eTraversalNeeded;
}
}
diff --git a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
index 7642122..593c4ff 100644
--- a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
+++ b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
@@ -585,7 +585,7 @@
displayInfo.receivesInput = proto.receives_input();
displayInfo.isSecure = proto.is_secure();
displayInfo.isPrimary = proto.is_primary();
- displayInfo.isPrimary = proto.is_virtual();
+ displayInfo.isVirtual = proto.is_virtual();
displayInfo.rotationFlags = (ui::Transform::RotationFlags)proto.rotation_flags();
displayInfo.transformHint = (ui::Transform::RotationFlags)proto.transform_hint();
return displayInfo;
@@ -593,7 +593,7 @@
void TransactionProtoParser::fromProto(
const google::protobuf::RepeatedPtrField<proto::DisplayInfo>& proto,
- display::DisplayMap<ui::LayerStack, frontend::DisplayInfo> outDisplayInfos) {
+ display::DisplayMap<ui::LayerStack, frontend::DisplayInfo>& outDisplayInfos) {
outDisplayInfos.clear();
for (const proto::DisplayInfo& displayInfo : proto) {
outDisplayInfos.emplace_or_replace(ui::LayerStack::fromValue(displayInfo.layer_stack()),
diff --git a/services/surfaceflinger/Tracing/TransactionProtoParser.h b/services/surfaceflinger/Tracing/TransactionProtoParser.h
index 50944fc..d6c98e1 100644
--- a/services/surfaceflinger/Tracing/TransactionProtoParser.h
+++ b/services/surfaceflinger/Tracing/TransactionProtoParser.h
@@ -49,15 +49,16 @@
proto::TransactionState toProto(const std::map<uint32_t /* layerId */, TracingLayerState>&);
proto::LayerCreationArgs toProto(const LayerCreationArgs& args);
proto::LayerState toProto(const ResolvedComposerState&);
- proto::DisplayInfo toProto(const frontend::DisplayInfo&, uint32_t layerStack);
+ static proto::DisplayInfo toProto(const frontend::DisplayInfo&, uint32_t layerStack);
TransactionState fromProto(const proto::TransactionState&);
void mergeFromProto(const proto::LayerState&, TracingLayerState& outState);
void fromProto(const proto::LayerCreationArgs&, LayerCreationArgs& outArgs);
std::unique_ptr<FlingerDataMapper> mMapper;
- frontend::DisplayInfo fromProto(const proto::DisplayInfo&);
- void fromProto(const google::protobuf::RepeatedPtrField<proto::DisplayInfo>&,
- display::DisplayMap<ui::LayerStack, frontend::DisplayInfo> outDisplayInfos);
+ static frontend::DisplayInfo fromProto(const proto::DisplayInfo&);
+ static void fromProto(
+ const google::protobuf::RepeatedPtrField<proto::DisplayInfo>&,
+ display::DisplayMap<ui::LayerStack, frontend::DisplayInfo>& outDisplayInfos);
private:
proto::DisplayState toProto(const DisplayState&);
diff --git a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp
index 0ea421b..4b4ce18 100644
--- a/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp
+++ b/services/surfaceflinger/Tracing/tools/LayerTraceGenerator.cpp
@@ -92,6 +92,16 @@
for (int j = 0; j < entry.transactions_size(); j++) {
// apply transactions
TransactionState transaction = parser.fromProto(entry.transactions(j));
+ for (auto& resolvedComposerState : transaction.states) {
+ if (resolvedComposerState.state.what & layer_state_t::eInputInfoChanged) {
+ if (!resolvedComposerState.state.windowInfoHandle->getInfo()->inputConfig.test(
+ gui::WindowInfo::InputConfig::NO_INPUT_CHANNEL)) {
+ // create a fake token since the FE expects a valid token
+ resolvedComposerState.state.windowInfoHandle->editInfo()->token =
+ sp<BBinder>::make();
+ }
+ }
+ }
transactions.emplace_back(std::move(transaction));
}
diff --git a/services/surfaceflinger/tests/tracing/TransactionTraceTestSuite.cpp b/services/surfaceflinger/tests/tracing/TransactionTraceTestSuite.cpp
index 7355c35..3e3d8f0 100644
--- a/services/surfaceflinger/tests/tracing/TransactionTraceTestSuite.cpp
+++ b/services/surfaceflinger/tests/tracing/TransactionTraceTestSuite.cpp
@@ -22,6 +22,7 @@
#include <string>
#include <unordered_map>
+#include <LayerProtoHelper.h>
#include <LayerTraceGenerator.h>
#include <Tracing/TransactionProtoParser.h>
#include <layerproto/LayerProtoHeader.h>
@@ -94,11 +95,14 @@
float y;
uint32_t bufferWidth;
uint32_t bufferHeight;
+ Rect touchableRegionBounds;
};
bool operator==(const LayerInfo& lh, const LayerInfo& rh) {
- return std::make_tuple(lh.id, lh.name, lh.parent, lh.z, lh.curr_frame) ==
- std::make_tuple(rh.id, rh.name, rh.parent, rh.z, rh.curr_frame);
+ return std::make_tuple(lh.id, lh.name, lh.parent, lh.z, lh.curr_frame, lh.bufferWidth,
+ lh.bufferHeight, lh.touchableRegionBounds) ==
+ std::make_tuple(rh.id, rh.name, rh.parent, rh.z, rh.curr_frame, rh.bufferWidth,
+ rh.bufferHeight, rh.touchableRegionBounds);
}
bool compareById(const LayerInfo& a, const LayerInfo& b) {
@@ -109,7 +113,9 @@
*os << "Layer [" << info.id << "] name=" << info.name << " parent=" << info.parent
<< " z=" << info.z << " curr_frame=" << info.curr_frame << " x=" << info.x
<< " y=" << info.y << " bufferWidth=" << info.bufferWidth
- << " bufferHeight=" << info.bufferHeight;
+ << " bufferHeight=" << info.bufferHeight << "touchableRegionBounds={"
+ << info.touchableRegionBounds.left << "," << info.touchableRegionBounds.top << ","
+ << info.touchableRegionBounds.right << "," << info.touchableRegionBounds.bottom << "}";
}
struct find_id : std::unary_function<LayerInfo, bool> {
@@ -119,6 +125,17 @@
};
static LayerInfo getLayerInfoFromProto(::android::surfaceflinger::LayerProto& proto) {
+ Rect touchableRegionBounds = Rect::INVALID_RECT;
+ // ignore touchable region for layers without buffers, the new fe aggressively avoids
+ // calculating state for layers that are not visible which could lead to mismatches
+ if (proto.has_input_window_info() && proto.input_window_info().has_touchable_region() &&
+ proto.has_active_buffer()) {
+ Region touchableRegion;
+ LayerProtoHelper::readFromProto(proto.input_window_info().touchable_region(),
+ touchableRegion);
+ touchableRegionBounds = touchableRegion.bounds();
+ }
+
return {proto.id(),
proto.name(),
proto.parent(),
@@ -127,7 +144,8 @@
proto.has_position() ? proto.position().x() : -1,
proto.has_position() ? proto.position().y() : -1,
proto.has_active_buffer() ? proto.active_buffer().width() : 0,
- proto.has_active_buffer() ? proto.active_buffer().height() : 0};
+ proto.has_active_buffer() ? proto.active_buffer().height() : 0,
+ touchableRegionBounds};
}
TEST_P(TransactionTraceTestSuite, validateEndState) {
diff --git a/services/surfaceflinger/tests/unittests/TransactionProtoParserTest.cpp b/services/surfaceflinger/tests/unittests/TransactionProtoParserTest.cpp
index 3dea189..dd72174 100644
--- a/services/surfaceflinger/tests/unittests/TransactionProtoParserTest.cpp
+++ b/services/surfaceflinger/tests/unittests/TransactionProtoParserTest.cpp
@@ -19,6 +19,7 @@
#include <limits> // std::numeric_limits
#include <gui/SurfaceComposerClient.h>
+#include <ui/Rotation.h>
#include "LayerProtoHelper.h"
#include "Tracing/TransactionProtoParser.h"
@@ -103,4 +104,48 @@
ASSERT_EQ(t1.displays[0].token, t2.displays[0].token);
}
+TEST(TransactionProtoParserTest, parseDisplayInfo) {
+ frontend::DisplayInfo d1;
+ d1.info.displayId = 42;
+ d1.info.logicalWidth = 43;
+ d1.info.logicalHeight = 44;
+ d1.info.transform.set(1, 2, 3, 4);
+ d1.transform = d1.info.transform.inverse();
+ d1.receivesInput = true;
+ d1.isSecure = false;
+ d1.isPrimary = true;
+ d1.isVirtual = false;
+ d1.rotationFlags = ui::Transform::ROT_180;
+ d1.transformHint = ui::Transform::ROT_90;
+
+ const uint32_t layerStack = 2;
+ google::protobuf::RepeatedPtrField<proto::DisplayInfo> displayProtos;
+ auto displayInfoProto = displayProtos.Add();
+ *displayInfoProto = TransactionProtoParser::toProto(d1, layerStack);
+ display::DisplayMap<ui::LayerStack, frontend::DisplayInfo> displayInfos;
+ TransactionProtoParser::fromProto(displayProtos, displayInfos);
+
+ ASSERT_TRUE(displayInfos.contains(ui::LayerStack::fromValue(layerStack)));
+ frontend::DisplayInfo d2 = displayInfos.get(ui::LayerStack::fromValue(layerStack))->get();
+ EXPECT_EQ(d1.info.displayId, d2.info.displayId);
+ EXPECT_EQ(d1.info.logicalWidth, d2.info.logicalWidth);
+ EXPECT_EQ(d1.info.logicalHeight, d2.info.logicalHeight);
+
+ EXPECT_EQ(d1.info.transform.dsdx(), d2.info.transform.dsdx());
+ EXPECT_EQ(d1.info.transform.dsdy(), d2.info.transform.dsdy());
+ EXPECT_EQ(d1.info.transform.dtdx(), d2.info.transform.dtdx());
+ EXPECT_EQ(d1.info.transform.dtdy(), d2.info.transform.dtdy());
+
+ EXPECT_EQ(d1.transform.dsdx(), d2.transform.dsdx());
+ EXPECT_EQ(d1.transform.dsdy(), d2.transform.dsdy());
+ EXPECT_EQ(d1.transform.dtdx(), d2.transform.dtdx());
+ EXPECT_EQ(d1.transform.dtdy(), d2.transform.dtdy());
+
+ EXPECT_EQ(d1.receivesInput, d2.receivesInput);
+ EXPECT_EQ(d1.isSecure, d2.isSecure);
+ EXPECT_EQ(d1.isVirtual, d2.isVirtual);
+ EXPECT_EQ(d1.rotationFlags, d2.rotationFlags);
+ EXPECT_EQ(d1.transformHint, d2.transformHint);
+}
+
} // namespace android