Skip to content

Commit de4ce29

Browse files
committed
SF: Remove *DisplayId::tryCast usage from ScreenCaptureOutput
Work towards DisplayId opaqueness by eliminating call-sites to APIs that parse the display ID values directly. One such site is ScreenCaptureOutput. Replace all calls to *DisplayId::tryCast with local calls to cached display variant. Flag: com.android.graphics.surfaceflinger.flags.stable_edid_ids Bug: 390690584 Test: libcompositionengine_test && libsurfaceflinger_unittest Change-Id: Ic83a2b2bfa6fc98b1d0fccc60f450d1587c2cc34
1 parent 2225717 commit de4ce29

7 files changed

Lines changed: 32 additions & 29 deletions

File tree

services/surfaceflinger/DisplayDevice.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <android-base/thread_annotations.h>
2424
#include <android/native_window.h>
2525
#include <binder/IBinder.h>
26+
#include <compositionengine/Display.h>
27+
#include <compositionengine/DisplaySurface.h>
2628
#include <gui/LayerState.h>
2729
#include <math/mat4.h>
2830
#include <renderengine/RenderEngine.h>
@@ -61,11 +63,6 @@ class SurfaceFlinger;
6163
struct CompositionInfo;
6264
struct DisplayDeviceCreationArgs;
6365

64-
namespace compositionengine {
65-
class Display;
66-
class DisplaySurface;
67-
} // namespace compositionengine
68-
6966
namespace display {
7067
class DisplaySnapshot;
7168
} // namespace display
@@ -123,6 +120,12 @@ class DisplayDevice : public RefBase {
123120

124121
DisplayId getId() const;
125122

123+
DisplayIdVariant getDisplayIdVariant() const {
124+
const auto idVariant = mCompositionDisplay->getDisplayIdVariant();
125+
LOG_FATAL_IF(!idVariant);
126+
return *idVariant;
127+
}
128+
126129
// Shorthand to upcast the ID of a display whose type is known as a precondition.
127130
PhysicalDisplayId getPhysicalId() const {
128131
const auto id = PhysicalDisplayId::tryCast(getId());

services/surfaceflinger/RegionSamplingThread.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ void RegionSamplingThread::captureSample() {
348348

349349
SurfaceFlinger::ScreenshotArgs screenshotArgs;
350350
screenshotArgs.captureTypeVariant = displayWeak;
351-
screenshotArgs.displayId = std::nullopt;
351+
screenshotArgs.displayIdVariant = std::nullopt;
352352
screenshotArgs.sourceCrop = sampledBounds.isEmpty() ? layerStackSpaceRect : sampledBounds;
353353
screenshotArgs.reqSize = sampledBounds.getSize();
354354
screenshotArgs.dataspace = ui::Dataspace::V0_SRGB;

services/surfaceflinger/ScreenCaptureOutput.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ namespace android {
3030
std::shared_ptr<ScreenCaptureOutput> createScreenCaptureOutput(ScreenCaptureOutputArgs args) {
3131
std::shared_ptr<ScreenCaptureOutput> output = compositionengine::impl::createOutputTemplated<
3232
ScreenCaptureOutput, compositionengine::CompositionEngine,
33-
/* sourceCrop */ const Rect, std::optional<DisplayId>,
33+
/* sourceCrop */ const Rect, ftl::Optional<DisplayIdVariant>,
3434
const compositionengine::Output::ColorProfile&,
3535
/* layerAlpha */ float,
36-
/* regionSampling */ bool>(args.compositionEngine, args.sourceCrop, args.displayId,
37-
args.colorProfile, args.layerAlpha, args.regionSampling,
36+
/* regionSampling */ bool>(args.compositionEngine, args.sourceCrop,
37+
args.displayIdVariant, args.colorProfile, args.layerAlpha,
38+
args.regionSampling,
3839
args.dimInGammaSpaceForEnhancedScreenshots,
3940
args.enableLocalTonemapping);
4041
output->editState().isSecure = args.isSecure;
@@ -59,21 +60,21 @@ std::shared_ptr<ScreenCaptureOutput> createScreenCaptureOutput(ScreenCaptureOutp
5960

6061
{
6162
std::string name = args.regionSampling ? "RegionSampling" : "ScreenCaptureOutput";
62-
if (args.displayId) {
63-
base::StringAppendF(&name, " for %" PRIu64, args.displayId.value().value);
63+
if (const auto id = args.displayIdVariant.and_then(asDisplayIdOfType<DisplayId>)) {
64+
base::StringAppendF(&name, " for %" PRIu64, id->value);
6465
}
6566
output->setName(name);
6667
}
6768
return output;
6869
}
6970

7071
ScreenCaptureOutput::ScreenCaptureOutput(
71-
const Rect sourceCrop, std::optional<DisplayId> displayId,
72+
const Rect sourceCrop, ftl::Optional<DisplayIdVariant> displayIdVariant,
7273
const compositionengine::Output::ColorProfile& colorProfile, float layerAlpha,
7374
bool regionSampling, bool dimInGammaSpaceForEnhancedScreenshots,
7475
bool enableLocalTonemapping)
7576
: mSourceCrop(sourceCrop),
76-
mDisplayId(displayId),
77+
mDisplayIdVariant(displayIdVariant),
7778
mColorProfile(colorProfile),
7879
mLayerAlpha(layerAlpha),
7980
mRegionSampling(regionSampling),
@@ -137,12 +138,9 @@ ScreenCaptureOutput::generateLuts() {
137138
}
138139

139140
std::vector<aidl::android::hardware::graphics::composer3::Luts> luts;
140-
if (mDisplayId) {
141-
const auto id = PhysicalDisplayId::tryCast(mDisplayId.value());
142-
if (id) {
143-
auto& hwc = getCompositionEngine().getHwComposer();
144-
hwc.getLuts(*id, buffers, &luts);
145-
}
141+
if (const auto physicalDisplayId = mDisplayIdVariant.and_then(asPhysicalDisplayId)) {
142+
auto& hwc = getCompositionEngine().getHwComposer();
143+
hwc.getLuts(*physicalDisplayId, buffers, &luts);
146144
}
147145

148146
if (buffers.size() == luts.size()) {

services/surfaceflinger/ScreenCaptureOutput.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct ScreenCaptureOutputArgs {
3030
ui::LayerStack layerStack;
3131
Rect sourceCrop;
3232
std::shared_ptr<renderengine::ExternalTexture> buffer;
33-
std::optional<DisplayId> displayId;
33+
ftl::Optional<DisplayIdVariant> displayIdVariant;
3434
ui::Size reqBufferSize;
3535
float sdrWhitePointNits;
3636
float displayBrightnessNits;
@@ -51,7 +51,7 @@ struct ScreenCaptureOutputArgs {
5151
// SurfaceFlinger::captureLayers and SurfaceFlinger::captureDisplay.
5252
class ScreenCaptureOutput : public compositionengine::impl::Output {
5353
public:
54-
ScreenCaptureOutput(const Rect sourceCrop, std::optional<DisplayId> displayId,
54+
ScreenCaptureOutput(const Rect sourceCrop, ftl::Optional<DisplayIdVariant> displayIdVariant,
5555
const compositionengine::Output::ColorProfile& colorProfile,
5656
float layerAlpha, bool regionSampling,
5757
bool dimInGammaSpaceForEnhancedScreenshots, bool enableLocalTonemapping);
@@ -70,7 +70,7 @@ class ScreenCaptureOutput : public compositionengine::impl::Output {
7070
private:
7171
std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts> generateLuts();
7272
const Rect mSourceCrop;
73-
const std::optional<DisplayId> mDisplayId;
73+
const ftl::Optional<DisplayIdVariant> mDisplayIdVariant;
7474
const compositionengine::Output::ColorProfile& mColorProfile;
7575
const float mLayerAlpha;
7676
const bool mRegionSampling;

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7340,7 +7340,7 @@ void SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
73407340
}
73417341

73427342
wp<const DisplayDevice> displayWeak;
7343-
DisplayId displayId;
7343+
ftl::Optional<DisplayIdVariant> displayIdVariantOpt;
73447344
ui::LayerStack layerStack;
73457345
ui::Size reqSize(args.width, args.height);
73467346
std::unordered_set<uint32_t> excludeLayerIds;
@@ -7356,7 +7356,7 @@ void SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
73567356
return;
73577357
}
73587358
displayWeak = display;
7359-
displayId = display->getId();
7359+
displayIdVariantOpt = display->getDisplayIdVariant();
73607360
layerStack = display->getLayerStack();
73617361
displayIsSecure = display->isSecure();
73627362

@@ -7384,7 +7384,7 @@ void SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
73847384

73857385
ScreenshotArgs screenshotArgs;
73867386
screenshotArgs.captureTypeVariant = displayWeak;
7387-
screenshotArgs.displayId = displayId;
7387+
screenshotArgs.displayIdVariant = displayIdVariantOpt;
73887388
screenshotArgs.sourceCrop = gui::aidl_utils::fromARect(captureArgs.sourceCrop);
73897389
if (screenshotArgs.sourceCrop.isEmpty()) {
73907390
screenshotArgs.sourceCrop = layerStackSpaceRect;
@@ -7403,6 +7403,7 @@ void SurfaceFlinger::captureDisplay(DisplayId displayId, const CaptureArgs& args
74037403
const sp<IScreenCaptureListener>& captureListener) {
74047404
ui::LayerStack layerStack;
74057405
wp<const DisplayDevice> displayWeak;
7406+
ftl::Optional<DisplayIdVariant> displayIdVariantOpt;
74067407
ui::Size size;
74077408
Rect layerStackSpaceRect;
74087409
bool displayIsSecure;
@@ -7418,6 +7419,7 @@ void SurfaceFlinger::captureDisplay(DisplayId displayId, const CaptureArgs& args
74187419
}
74197420

74207421
displayWeak = display;
7422+
displayIdVariantOpt = display->getDisplayIdVariant();
74217423
layerStack = display->getLayerStack();
74227424
layerStackSpaceRect = display->getLayerStackSpaceRect();
74237425
size = display->getLayerStackSpaceRect().getSize();
@@ -7452,7 +7454,7 @@ void SurfaceFlinger::captureDisplay(DisplayId displayId, const CaptureArgs& args
74527454

74537455
ScreenshotArgs screenshotArgs;
74547456
screenshotArgs.captureTypeVariant = displayWeak;
7455-
screenshotArgs.displayId = displayId;
7457+
screenshotArgs.displayIdVariant = displayIdVariantOpt;
74567458
screenshotArgs.sourceCrop = layerStackSpaceRect;
74577459
screenshotArgs.reqSize = size;
74587460
screenshotArgs.dataspace = static_cast<ui::Dataspace>(args.dataspace);
@@ -7944,7 +7946,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
79447946
.layerStack = layerStack,
79457947
.sourceCrop = args.sourceCrop,
79467948
.buffer = std::move(buffer),
7947-
.displayId = args.displayId,
7949+
.displayIdVariant = args.displayIdVariant,
79487950
.reqBufferSize = args.reqSize,
79497951
.sdrWhitePointNits = args.sdrWhitePointNits,
79507952
.displayBrightnessNits = args.displayBrightnessNits,

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ class SurfaceFlinger : public BnSurfaceComposer,
876876
std::variant<int32_t, wp<const DisplayDevice>> captureTypeVariant;
877877

878878
// Display ID of the display the result will be on
879-
std::optional<DisplayId> displayId{std::nullopt};
879+
ftl::Optional<DisplayIdVariant> displayIdVariant{std::nullopt};
880880

881881
// If true, transform is inverted from the parent layer snapshot
882882
bool childrenOnly{false};

services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ class TestableSurfaceFlinger {
481481

482482
SurfaceFlinger::ScreenshotArgs screenshotArgs;
483483
screenshotArgs.captureTypeVariant = display;
484-
screenshotArgs.displayId = std::nullopt;
484+
screenshotArgs.displayIdVariant = std::nullopt;
485485
screenshotArgs.sourceCrop = sourceCrop;
486486
screenshotArgs.reqSize = sourceCrop.getSize();
487487
screenshotArgs.dataspace = dataspace;

0 commit comments

Comments
 (0)