Skip to content

Commit 515b2e4

Browse files
Treehugger RobotAndroid (Google) Code Review
authored andcommitted
Merge "[SF] SysProp max_acquired_buffers" into main
2 parents d15c73e + 0d33ab4 commit 515b2e4

6 files changed

Lines changed: 58 additions & 8 deletions

File tree

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ bool SurfaceFlinger::useHwcForRgbToYuv;
384384
bool SurfaceFlinger::hasSyncFramework;
385385
int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
386386
int64_t SurfaceFlinger::minAcquiredBuffers = 1;
387+
std::optional<int64_t> SurfaceFlinger::maxAcquiredBuffersOpt;
387388
uint32_t SurfaceFlinger::maxGraphicsWidth;
388389
uint32_t SurfaceFlinger::maxGraphicsHeight;
389390
bool SurfaceFlinger::useContextPriority;
@@ -452,6 +453,7 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI
452453
maxFrameBufferAcquiredBuffers = max_frame_buffer_acquired_buffers(2);
453454
minAcquiredBuffers =
454455
SurfaceFlingerProperties::min_acquired_buffers().value_or(minAcquiredBuffers);
456+
maxAcquiredBuffersOpt = SurfaceFlingerProperties::max_acquired_buffers();
455457

456458
maxGraphicsWidth = std::max(max_graphics_width(0), 0);
457459
maxGraphicsHeight = std::max(max_graphics_height(0), 0);
@@ -8240,11 +8242,13 @@ int SurfaceFlinger::getGpuContextPriority() {
82408242

82418243
int SurfaceFlinger::calculateMaxAcquiredBufferCount(Fps refreshRate,
82428244
std::chrono::nanoseconds presentLatency) {
8243-
auto pipelineDepth = presentLatency.count() / refreshRate.getPeriodNsecs();
8245+
int64_t pipelineDepth = presentLatency.count() / refreshRate.getPeriodNsecs();
82448246
if (presentLatency.count() % refreshRate.getPeriodNsecs()) {
82458247
pipelineDepth++;
82468248
}
8247-
return std::max(minAcquiredBuffers, static_cast<int64_t>(pipelineDepth - 1));
8249+
const int64_t maxAcquiredBuffers =
8250+
std::min(pipelineDepth - 1, maxAcquiredBuffersOpt.value_or(pipelineDepth - 1));
8251+
return std::max(minAcquiredBuffers, maxAcquiredBuffers);
82488252
}
82498253

82508254
status_t SurfaceFlinger::getMaxAcquiredBufferCount(int* buffers) const {

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ class SurfaceFlinger : public BnSurfaceComposer,
238238
// ISurfaceComposer.getMaxAcquiredBufferCount().
239239
static int64_t minAcquiredBuffers;
240240

241+
// Controls the maximum acquired buffers SurfaceFlinger will suggest via
242+
// ISurfaceComposer.getMaxAcquiredBufferCount().
243+
// Value is set through ro.surface_flinger.max_acquired_buffers.
244+
static std::optional<int64_t> maxAcquiredBuffersOpt;
245+
241246
// Controls the maximum width and height in pixels that the graphics pipeline can support for
242247
// GPU fallback composition. For example, 8k devices with 4k GPUs, or 4k devices with 2k GPUs.
243248
static uint32_t maxGraphicsWidth;

services/surfaceflinger/sysprop/SurfaceFlingerProperties.sysprop

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,16 @@ prop {
483483
prop_name: "ro.surface_flinger.min_acquired_buffers"
484484
}
485485

486+
# Defines the maximum acquired buffers SurfaceFlinger will suggest via
487+
# ISurfaceComposer.getMaxAcquiredBufferCount().
488+
prop {
489+
api_name: "max_acquired_buffers"
490+
type: Long
491+
scope: Public
492+
access: Readonly
493+
prop_name: "ro.surface_flinger.max_acquired_buffers"
494+
}
495+
486496
# When enabled, SurfaceFlinger will attempt to clear the per-layer HAL buffer cache slots for
487497
# buffers when they are evicted from the app cache by using additional setLayerBuffer commands.
488498
# Ideally, this behavior would always be enabled to reduce graphics memory consumption. However,

services/surfaceflinger/sysprop/api/SurfaceFlingerProperties-current.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ props {
8181
api_name: "ignore_hdr_camera_layers"
8282
prop_name: "ro.surface_flinger.ignore_hdr_camera_layers"
8383
}
84+
prop {
85+
api_name: "max_acquired_buffers"
86+
type: Long
87+
prop_name: "ro.surface_flinger.max_acquired_buffers"
88+
}
8489
prop {
8590
api_name: "max_frame_buffer_acquired_buffers"
8691
type: Long

services/surfaceflinger/tests/unittests/SchedulerTest.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,18 +254,43 @@ TEST_F(SchedulerTest, emitModeChangeEvent) {
254254
}
255255

256256
TEST_F(SchedulerTest, calculateMaxAcquiredBufferCount) {
257-
EXPECT_EQ(1, mFlinger.calculateMaxAcquiredBufferCount(60_Hz, 30ms));
258-
EXPECT_EQ(2, mFlinger.calculateMaxAcquiredBufferCount(90_Hz, 30ms));
259-
EXPECT_EQ(3, mFlinger.calculateMaxAcquiredBufferCount(120_Hz, 30ms));
257+
struct TestCase {
258+
Fps refreshRate;
259+
std::chrono::nanoseconds presentLatency;
260+
int expectedBufferCount;
261+
};
260262

261-
EXPECT_EQ(2, mFlinger.calculateMaxAcquiredBufferCount(60_Hz, 40ms));
263+
const auto verifyTestCases = [&](std::vector<TestCase> tests) {
264+
for (const auto testCase : tests) {
265+
EXPECT_EQ(testCase.expectedBufferCount,
266+
mFlinger.calculateMaxAcquiredBufferCount(testCase.refreshRate,
267+
testCase.presentLatency));
268+
}
269+
};
262270

263-
EXPECT_EQ(1, mFlinger.calculateMaxAcquiredBufferCount(60_Hz, 10ms));
271+
std::vector<TestCase> testCases{{60_Hz, 30ms, 1},
272+
{90_Hz, 30ms, 2},
273+
{120_Hz, 30ms, 3},
274+
{60_Hz, 40ms, 2},
275+
{60_Hz, 10ms, 1}};
276+
verifyTestCases(testCases);
264277

265278
const auto savedMinAcquiredBuffers = mFlinger.mutableMinAcquiredBuffers();
266279
mFlinger.mutableMinAcquiredBuffers() = 2;
267-
EXPECT_EQ(2, mFlinger.calculateMaxAcquiredBufferCount(60_Hz, 10ms));
280+
verifyTestCases({{60_Hz, 10ms, 2}});
268281
mFlinger.mutableMinAcquiredBuffers() = savedMinAcquiredBuffers;
282+
283+
const auto savedMaxAcquiredBuffers = mFlinger.mutableMaxAcquiredBuffers();
284+
mFlinger.mutableMaxAcquiredBuffers() = 2;
285+
testCases = {{60_Hz, 30ms, 1},
286+
{90_Hz, 30ms, 2},
287+
{120_Hz, 30ms, 2}, // max buffers allowed is 2
288+
{60_Hz, 40ms, 2},
289+
{60_Hz, 10ms, 1}};
290+
verifyTestCases(testCases);
291+
mFlinger.mutableMaxAcquiredBuffers() = 3; // max buffers allowed is 3
292+
verifyTestCases({{120_Hz, 30ms, 3}});
293+
mFlinger.mutableMaxAcquiredBuffers() = savedMaxAcquiredBuffers;
269294
}
270295

271296
MATCHER(Is120Hz, "") {

services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,7 @@ class TestableSurfaceFlinger {
720720
}
721721

722722
auto& mutableMinAcquiredBuffers() { return SurfaceFlinger::minAcquiredBuffers; }
723+
auto& mutableMaxAcquiredBuffers() { return SurfaceFlinger::maxAcquiredBuffersOpt; }
723724
auto& mutableLayerSnapshotBuilder() NO_THREAD_SAFETY_ANALYSIS {
724725
return mFlinger->mLayerSnapshotBuilder;
725726
}

0 commit comments

Comments
 (0)