SF: cleanup CommandWriterBase and CommandReaderBase part 2
Bug: 208856704
Test: VTS
Change-Id: I10f228e2c7b49cb6e2bece40605d55509cd8b5b4
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
index 081f526..d97a399 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -373,10 +373,14 @@
Error AidlComposer::getChangedCompositionTypes(
Display display, std::vector<Layer>* outLayers,
std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
- std::vector<int64_t> layers;
- mReader.takeChangedCompositionTypes(translate<int64_t>(display), &layers, outTypes);
+ const auto changedLayers = mReader.takeChangedCompositionTypes(translate<int64_t>(display));
+ outLayers->reserve(changedLayers.size());
+ outTypes->reserve(changedLayers.size());
- *outLayers = translate<Layer>(layers);
+ for (const auto& layer : changedLayers) {
+ outLayers->emplace_back(translate<Layer>(layer.layer));
+ outTypes->emplace_back(layer.composition);
+ }
return Error::NONE;
}
@@ -429,10 +433,15 @@
Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
std::vector<Layer>* outLayers,
std::vector<uint32_t>* outLayerRequestMasks) {
- std::vector<int64_t> layers;
- mReader.takeDisplayRequests(translate<int64_t>(display), outDisplayRequestMask, &layers,
- outLayerRequestMasks);
- *outLayers = translate<Layer>(layers);
+ const auto displayRequests = mReader.takeDisplayRequests(translate<int64_t>(display));
+ *outDisplayRequestMask = translate<uint32_t>(displayRequests.mask);
+ outLayers->reserve(displayRequests.layerRequests.size());
+ outLayerRequestMasks->reserve(displayRequests.layerRequests.size());
+
+ for (const auto& layer : displayRequests.layerRequests) {
+ outLayers->emplace_back(translate<Layer>(layer.layer));
+ outLayerRequestMasks->emplace_back(translate<uint32_t>(layer.mask));
+ }
return Error::NONE;
}
@@ -469,9 +478,17 @@
Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
std::vector<int>* outReleaseFences) {
- std::vector<int64_t> layers;
- mReader.takeReleaseFences(translate<int64_t>(display), &layers, outReleaseFences);
- *outLayers = translate<Layer>(layers);
+ auto fences = mReader.takeReleaseFences(translate<int64_t>(display));
+ outLayers->reserve(fences.size());
+ outReleaseFences->reserve(fences.size());
+
+ for (auto& fence : fences) {
+ outLayers->emplace_back(translate<Layer>(fence.layer));
+ // take ownership
+ const int fenceOwner = fence.fence.get();
+ *fence.fence.getR() = -1;
+ outReleaseFences->emplace_back(fenceOwner);
+ }
return Error::NONE;
}
@@ -484,8 +501,10 @@
return error;
}
- mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
-
+ auto fence = mReader.takePresentFence(translate<int64_t>(display));
+ // take ownership
+ *outPresentFence = fence.get();
+ *fence.getR() = -1;
return Error::NONE;
}
@@ -597,13 +616,22 @@
return error;
}
- mReader.takePresentOrValidateStage(translate<int64_t>(display), state);
-
- if (*state == 1) { // Present succeeded
- mReader.takePresentFence(translate<int64_t>(display), outPresentFence);
+ const auto result = mReader.takePresentOrValidateStage(translate<int64_t>(display));
+ if (!result.has_value()) {
+ *state = translate<uint32_t>(-1);
+ return Error::NO_RESOURCES;
}
- if (*state == 0) { // Validate succeeded.
+ *state = translate<uint32_t>(*result);
+
+ if (*result == PresentOrValidate::Result::Presented) {
+ auto fence = mReader.takePresentFence(translate<int64_t>(display));
+ // take ownership
+ *outPresentFence = fence.get();
+ *fence.getR() = -1;
+ }
+
+ if (*result == PresentOrValidate::Result::Validated) {
mReader.hasChanges(translate<int64_t>(display), outNumTypes, outNumRequests);
}
@@ -711,14 +739,16 @@
return Error::NONE;
}
- std::vector<CommandResultPayload> results;
- auto status = mAidlComposerClient->executeCommands(commands, &results);
- if (!status.isOk()) {
- ALOGE("executeCommands failed %s", status.getDescription().c_str());
- return static_cast<Error>(status.getServiceSpecificError());
- }
+ { // scope for results
+ std::vector<CommandResultPayload> results;
+ auto status = mAidlComposerClient->executeCommands(commands, &results);
+ if (!status.isOk()) {
+ ALOGE("executeCommands failed %s", status.getDescription().c_str());
+ return static_cast<Error>(status.getServiceSpecificError());
+ }
- mReader.parse(results);
+ mReader.parse(std::move(results));
+ }
const auto commandErrors = mReader.takeErrors();
Error error = Error::NONE;
for (const auto& cmdErr : commandErrors) {
@@ -993,9 +1023,10 @@
Error AidlComposer::getClientTargetProperty(
Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
float* whitePointNits) {
- ClientTargetProperty property;
- mReader.takeClientTargetProperty(translate<int64_t>(display), &property, whitePointNits);
- *outClientTargetProperty = translate<IComposerClient::ClientTargetProperty>(property);
+ const auto property = mReader.takeClientTargetProperty(translate<int64_t>(display));
+ *outClientTargetProperty =
+ translate<IComposerClient::ClientTargetProperty>(property.clientTargetProperty);
+ *whitePointNits = property.whitePointNits;
return Error::NONE;
}