Skip to content

Commit 4c0785f

Browse files
Sally QiAndroid (Google) Code Review
authored andcommitted
Merge "[Lut backend] Fix a bug where we were passing a nullptr to the HWC when we wanted to clear the LUTs." into main
2 parents 7a85800 + 36349ac commit 4c0785f

2 files changed

Lines changed: 23 additions & 20 deletions

File tree

services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -589,28 +589,30 @@ void OutputLayer::writeOutputIndependentGeometryStateToHWC(
589589

590590
void OutputLayer::writeLutToHWC(HWC2::Layer* hwcLayer,
591591
const LayerFECompositionState& outputIndependentState) {
592-
if (!outputIndependentState.luts) {
593-
return;
594-
}
595-
auto& lutFileDescriptor = outputIndependentState.luts->getLutFileDescriptor();
596-
auto lutOffsets = outputIndependentState.luts->offsets;
597-
auto& lutProperties = outputIndependentState.luts->lutProperties;
592+
Luts luts;
593+
// if outputIndependentState.luts is nullptr, it means we want to clear the LUTs
594+
// and we pass an empty Luts object to the HWC.
595+
if (outputIndependentState.luts) {
596+
auto& lutFileDescriptor = outputIndependentState.luts->getLutFileDescriptor();
597+
auto lutOffsets = outputIndependentState.luts->offsets;
598+
auto& lutProperties = outputIndependentState.luts->lutProperties;
599+
600+
std::vector<LutProperties> aidlProperties;
601+
aidlProperties.reserve(lutProperties.size());
602+
for (size_t i = 0; i < lutOffsets.size(); i++) {
603+
LutProperties properties;
604+
properties.dimension = static_cast<LutProperties::Dimension>(lutProperties[i].dimension);
605+
properties.size = lutProperties[i].size;
606+
properties.samplingKeys = {
607+
static_cast<LutProperties::SamplingKey>(lutProperties[i].samplingKey)};
608+
aidlProperties.emplace_back(properties);
609+
}
598610

599-
std::vector<LutProperties> aidlProperties;
600-
aidlProperties.reserve(lutProperties.size());
601-
for (size_t i = 0; i < lutOffsets.size(); i++) {
602-
LutProperties properties;
603-
properties.dimension = static_cast<LutProperties::Dimension>(lutProperties[i].dimension);
604-
properties.size = lutProperties[i].size;
605-
properties.samplingKeys = {
606-
static_cast<LutProperties::SamplingKey>(lutProperties[i].samplingKey)};
607-
aidlProperties.emplace_back(properties);
608-
}
609611

610-
Luts luts;
611-
luts.pfd = ndk::ScopedFileDescriptor(dup(lutFileDescriptor.get()));
612-
luts.offsets = lutOffsets;
613-
luts.lutProperties = std::move(aidlProperties);
612+
luts.pfd = ndk::ScopedFileDescriptor(dup(lutFileDescriptor.get()));
613+
luts.offsets = lutOffsets;
614+
luts.lutProperties = std::move(aidlProperties);
615+
}
614616

615617
switch (auto error = hwcLayer->setLuts(luts)) {
616618
case hal::Error::NONE:

services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,7 @@ struct OutputLayerWriteStateToHWCTest : public OutputLayerTest {
901901
EXPECT_CALL(*mHwcLayer, setSurfaceDamage(RegionEq(surfaceDamage))).WillOnce(Return(kError));
902902
EXPECT_CALL(*mHwcLayer, setBlockingRegion(RegionEq(blockingRegion)))
903903
.WillOnce(Return(kError));
904+
EXPECT_CALL(*mHwcLayer, setLuts(_)).WillOnce(Return(kError));
904905
}
905906

906907
void expectSetCompositionTypeCall(Composition compositionType) {

0 commit comments

Comments
 (0)