Skip to content

Commit eb5c137

Browse files
Treehugger RobotAndroid (Google) Code Review
authored andcommitted
Merge "[Lut screenshot] backend implementation v2" into main
2 parents 9bf3e87 + 10fc899 commit eb5c137

12 files changed

Lines changed: 95 additions & 12 deletions

File tree

services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class CompositionEngine {
5353
createLayerFECompositionState() = 0;
5454

5555
virtual HWComposer& getHwComposer() const = 0;
56-
virtual void setHwComposer(std::unique_ptr<HWComposer>) = 0;
56+
virtual void setHwComposer(HWComposer*) = 0;
5757

5858
virtual renderengine::RenderEngine& getRenderEngine() const = 0;
5959
virtual void setRenderEngine(renderengine::RenderEngine*) = 0;

services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ class LayerFE : public virtual RefBase {
131131

132132
// Currently latched frame number, 0 if invalid.
133133
uint64_t frameNumber = 0;
134+
135+
// layer serial number, -1 if invalid.
136+
int32_t sequence = -1;
134137
};
135138

136139
// Describes the states of the release fence. Checking the states allows checks

services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CompositionEngine : public compositionengine::CompositionEngine {
3131
override;
3232

3333
HWComposer& getHwComposer() const override;
34-
void setHwComposer(std::unique_ptr<HWComposer>) override;
34+
void setHwComposer(HWComposer*) override;
3535

3636
renderengine::RenderEngine& getRenderEngine() const override;
3737
void setRenderEngine(renderengine::RenderEngine*) override;
@@ -59,7 +59,7 @@ class CompositionEngine : public compositionengine::CompositionEngine {
5959
void setNeedsAnotherUpdateForTest(bool);
6060

6161
private:
62-
std::unique_ptr<HWComposer> mHwComposer;
62+
HWComposer* mHwComposer;
6363
renderengine::RenderEngine* mRenderEngine;
6464
std::shared_ptr<TimeStats> mTimeStats;
6565
bool mNeedsAnotherUpdate = false;

services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class CompositionEngine : public compositionengine::CompositionEngine {
3737
std::unique_ptr<compositionengine::LayerFECompositionState>());
3838

3939
MOCK_CONST_METHOD0(getHwComposer, HWComposer&());
40-
MOCK_METHOD1(setHwComposer, void(std::unique_ptr<HWComposer>));
40+
MOCK_METHOD1(setHwComposer, void(HWComposer*));
4141

4242
MOCK_CONST_METHOD0(getRenderEngine, renderengine::RenderEngine&());
4343
MOCK_METHOD1(setRenderEngine, void(renderengine::RenderEngine*));

services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ CompositionEngine::createLayerFECompositionState() {
5858
}
5959

6060
HWComposer& CompositionEngine::getHwComposer() const {
61-
return *mHwComposer.get();
61+
return *mHwComposer;
6262
}
6363

64-
void CompositionEngine::setHwComposer(std::unique_ptr<HWComposer> hwComposer) {
65-
mHwComposer = std::move(hwComposer);
64+
void CompositionEngine::setHwComposer(HWComposer* hwComposer) {
65+
mHwComposer = hwComposer;
6666
}
6767

6868
renderengine::RenderEngine& CompositionEngine::getRenderEngine() const {

services/surfaceflinger/CompositionEngine/tests/CompositionEngineTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ TEST_F(CompositionEngineTest, canInstantiateCompositionEngine) {
6161

6262
TEST_F(CompositionEngineTest, canSetHWComposer) {
6363
android::mock::HWComposer* hwc = new StrictMock<android::mock::HWComposer>();
64-
mEngine.setHwComposer(std::unique_ptr<android::HWComposer>(hwc));
64+
mEngine.setHwComposer(static_cast<android::HWComposer*>(hwc));
6565

6666
EXPECT_EQ(hwc, &mEngine.getHwComposer());
6767
}

services/surfaceflinger/LayerFE.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ void LayerFE::prepareClearClientComposition(LayerFE::LayerSettings& layerSetting
191191
layerSettings.disableBlending = true;
192192
layerSettings.bufferId = 0;
193193
layerSettings.frameNumber = 0;
194+
layerSettings.sequence = -1;
194195

195196
// If layer is blacked out, force alpha to 1 so that we draw a black color layer.
196197
layerSettings.alpha = blackout ? 1.0f : 0.0f;
@@ -262,6 +263,7 @@ void LayerFE::prepareBufferStateClientComposition(
262263
layerSettings.source.buffer.maxLuminanceNits = maxLuminance;
263264
layerSettings.frameNumber = mSnapshot->frameNumber;
264265
layerSettings.bufferId = mSnapshot->externalTexture->getId();
266+
layerSettings.sequence = mSnapshot->sequence;
265267

266268
const bool useFiltering = targetSettings.needsFiltering ||
267269
mSnapshot->geomLayerTransform.needsBilinearFiltering();

services/surfaceflinger/ScreenCaptureOutput.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
#include "ScreenCaptureOutput.h"
1818
#include "ScreenCaptureRenderSurface.h"
19+
#include "common/include/common/FlagManager.h"
1920
#include "ui/Rotation.h"
2021

2122
#include <compositionengine/CompositionEngine.h>
2223
#include <compositionengine/DisplayColorProfileCreationArgs.h>
2324
#include <compositionengine/impl/DisplayColorProfile.h>
25+
#include <ui/HdrRenderTypeUtils.h>
2426
#include <ui/Rotation.h>
2527

2628
namespace android {
@@ -104,14 +106,84 @@ renderengine::DisplaySettings ScreenCaptureOutput::generateClientCompositionDisp
104106
return clientCompositionDisplay;
105107
}
106108

109+
std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts>
110+
ScreenCaptureOutput::generateLuts() {
111+
std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts> lutsMapper;
112+
if (FlagManager::getInstance().luts_api()) {
113+
std::vector<sp<GraphicBuffer>> buffers;
114+
std::vector<int32_t> layerIds;
115+
116+
for (const auto* layer : getOutputLayersOrderedByZ()) {
117+
const auto& layerState = layer->getState();
118+
const auto* layerFEState = layer->getLayerFE().getCompositionState();
119+
auto pixelFormat = layerFEState->buffer
120+
? std::make_optional(
121+
static_cast<ui::PixelFormat>(layerFEState->buffer->getPixelFormat()))
122+
: std::nullopt;
123+
const auto hdrType = getHdrRenderType(layerState.dataspace, pixelFormat,
124+
layerFEState->desiredHdrSdrRatio);
125+
if (layerFEState->buffer && !layerFEState->luts &&
126+
hdrType == HdrRenderType::GENERIC_HDR) {
127+
buffers.push_back(layerFEState->buffer);
128+
layerIds.push_back(layer->getLayerFE().getSequence());
129+
}
130+
}
131+
132+
std::vector<aidl::android::hardware::graphics::composer3::Luts> luts;
133+
if (auto displayDevice = mRenderArea.getDisplayDevice()) {
134+
const auto id = PhysicalDisplayId::tryCast(displayDevice->getId());
135+
if (id) {
136+
auto& hwc = getCompositionEngine().getHwComposer();
137+
hwc.getLuts(*id, buffers, &luts);
138+
}
139+
}
140+
141+
if (buffers.size() == luts.size()) {
142+
for (size_t i = 0; i < luts.size(); i++) {
143+
lutsMapper[layerIds[i]] = std::move(luts[i]);
144+
}
145+
}
146+
}
147+
return lutsMapper;
148+
}
149+
107150
std::vector<compositionengine::LayerFE::LayerSettings>
108151
ScreenCaptureOutput::generateClientCompositionRequests(
109152
bool supportsProtectedContent, ui::Dataspace outputDataspace,
110153
std::vector<compositionengine::LayerFE*>& outLayerFEs) {
154+
// This map maps the layer unique id to a Lut
155+
std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts> lutsMapper =
156+
generateLuts();
157+
111158
auto clientCompositionLayers = compositionengine::impl::Output::
112159
generateClientCompositionRequests(supportsProtectedContent, outputDataspace,
113160
outLayerFEs);
114161

162+
for (auto& layer : clientCompositionLayers) {
163+
if (lutsMapper.find(layer.sequence) != lutsMapper.end()) {
164+
auto& aidlLuts = lutsMapper[layer.sequence];
165+
if (aidlLuts.pfd.get() >= 0 && aidlLuts.offsets) {
166+
std::vector<int32_t> offsets = *aidlLuts.offsets;
167+
std::vector<int32_t> dimensions;
168+
dimensions.reserve(offsets.size());
169+
std::vector<int32_t> sizes;
170+
sizes.reserve(offsets.size());
171+
std::vector<int32_t> keys;
172+
keys.reserve(offsets.size());
173+
for (size_t j = 0; j < offsets.size(); j++) {
174+
dimensions.emplace_back(
175+
static_cast<int32_t>(aidlLuts.lutProperties[j].dimension));
176+
sizes.emplace_back(aidlLuts.lutProperties[j].size);
177+
keys.emplace_back(
178+
static_cast<int32_t>(aidlLuts.lutProperties[j].samplingKeys[0]));
179+
}
180+
layer.luts = std::make_shared<gui::DisplayLuts>(base::unique_fd(
181+
aidlLuts.pfd.dup().get()),
182+
offsets, dimensions, sizes, keys);
183+
}
184+
}
185+
}
186+
115187
if (mRegionSampling) {
116188
for (auto& layer : clientCompositionLayers) {
117189
layer.backgroundBlurRadius = 0;

services/surfaceflinger/ScreenCaptureOutput.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <compositionengine/RenderSurface.h>
2121
#include <compositionengine/impl/Output.h>
2222
#include <ui/Rect.h>
23+
#include <unordered_map>
2324

2425
#include "RenderArea.h"
2526

@@ -65,6 +66,7 @@ class ScreenCaptureOutput : public compositionengine::impl::Output {
6566
const std::shared_ptr<renderengine::ExternalTexture>& buffer) const override;
6667

6768
private:
69+
std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts> generateLuts();
6870
const RenderArea& mRenderArea;
6971
const compositionengine::Output::ColorProfile& mColorProfile;
7072
const bool mRegionSampling;

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,8 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) {
920920

921921
mCompositionEngine->setTimeStats(mTimeStats);
922922

923-
mCompositionEngine->setHwComposer(getFactory().createHWComposer(mHwcServiceName));
923+
mHWComposer = getFactory().createHWComposer(mHwcServiceName);
924+
mCompositionEngine->setHwComposer(mHWComposer.get());
924925
auto& composer = mCompositionEngine->getHwComposer();
925926
composer.setCallback(*this);
926927
mDisplayModeController.setHwComposer(&composer);
@@ -7697,6 +7698,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
76977698
std::unique_ptr<compositionengine::CompositionEngine> compositionEngine =
76987699
mFactory.createCompositionEngine();
76997700
compositionEngine->setRenderEngine(mRenderEngine.get());
7701+
compositionEngine->setHwComposer(mHWComposer.get());
77007702

77017703
std::vector<sp<compositionengine::LayerFE>> layerFEs;
77027704
layerFEs.reserve(layers.size());

0 commit comments

Comments
 (0)