Skip to content

Commit 329c7f9

Browse files
Jim ShargoAndroid (Google) Code Review
authored andcommitted
Merge "BufferQueues: Always respect setMaxDequeuedBufferCount" into main
2 parents 578ac8e + a62f051 commit 329c7f9

3 files changed

Lines changed: 61 additions & 2 deletions

File tree

libs/gui/BufferQueueProducer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,10 @@ status_t BufferQueueProducer::waitForFreeSlotThenRelock(FreeSlotCaller caller,
364364
// Producers are not allowed to dequeue more than
365365
// mMaxDequeuedBufferCount buffers.
366366
// This check is only done if a buffer has already been queued
367-
if (mCore->mBufferHasBeenQueued &&
368-
dequeuedCount >= mCore->mMaxDequeuedBufferCount) {
367+
using namespace com::android::graphics::libgui::flags;
368+
bool flagGatedBufferHasBeenQueued =
369+
bq_always_use_max_dequeued_buffer_count() || mCore->mBufferHasBeenQueued;
370+
if (flagGatedBufferHasBeenQueued && dequeuedCount >= mCore->mMaxDequeuedBufferCount) {
369371
// Supress error logs when timeout is non-negative.
370372
if (mDequeueTimeout < 0) {
371373
BQ_LOGE("%s: attempting to exceed the max dequeued buffer "

libs/gui/libgui_flags.aconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,14 @@ flag {
153153
}
154154
is_fixed_read_only: true
155155
} # allocate_buffer_priority
156+
157+
flag {
158+
name: "bq_always_use_max_dequeued_buffer_count"
159+
namespace: "core_graphics"
160+
description: "BufferQueueProducer::dequeue's respects setMaxDequeuedBufferCount even before a buffer is dequeued."
161+
bug: "399328309"
162+
metadata {
163+
purpose: PURPOSE_BUGFIX
164+
}
165+
is_fixed_read_only: true
166+
} # bq_always_use_max_dequeued_buffer_count

libs/gui/tests/Surface_test.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,6 +2237,52 @@ TEST_F(SurfaceTest, BatchIllegalOperations) {
22372237
ASSERT_EQ(NO_ERROR, surface->disconnect(NATIVE_WINDOW_API_CPU));
22382238
}
22392239

2240+
TEST_F(SurfaceTest, setMaxDequeuedBufferCount_setMaxAcquiredBufferCount_allocations) {
2241+
//
2242+
// Set up the consumer and producer--nothing fancy.
2243+
//
2244+
auto [consumer, surface] =
2245+
BufferItemConsumer::create(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER);
2246+
sp<SurfaceListener> surfaceListener = sp<StubSurfaceListener>::make();
2247+
surface->connect(NATIVE_WINDOW_API_CPU, surfaceListener);
2248+
sp<GraphicBuffer> buffer;
2249+
sp<Fence> fence;
2250+
2251+
//
2252+
// These values are independent. The consumer can dequeue 3 and the consumer can acquire 3 at
2253+
// the same time.
2254+
//
2255+
ASSERT_EQ(OK, consumer->setMaxAcquiredBufferCount(3));
2256+
ASSERT_EQ(OK, surface->setMaxDequeuedBufferCount(3));
2257+
2258+
//
2259+
// Take all three buffers out of the queue--a fourth can't be retrieved. Then queue them.
2260+
//
2261+
std::vector<Surface::BatchBuffer> dequeuedBuffers(3);
2262+
EXPECT_EQ(OK, surface->dequeueBuffers(&dequeuedBuffers));
2263+
if (::com::android::graphics::libgui::flags::bq_always_use_max_dequeued_buffer_count()) {
2264+
EXPECT_EQ(INVALID_OPERATION, surface->dequeueBuffer(&buffer, &fence));
2265+
}
2266+
2267+
for (auto& batchBuffer : dequeuedBuffers) {
2268+
EXPECT_EQ(OK,
2269+
surface->queueBuffer(GraphicBuffer::from(batchBuffer.buffer),
2270+
sp<Fence>::make(batchBuffer.fenceFd)));
2271+
}
2272+
dequeuedBuffers.assign(3, {});
2273+
2274+
//
2275+
// Acquire all three, then we should be able to dequeue 3 more.
2276+
//
2277+
std::vector<BufferItem> acquiredBuffers(3);
2278+
for (auto& bufferItem : acquiredBuffers) {
2279+
EXPECT_EQ(OK, consumer->acquireBuffer(&bufferItem, 0));
2280+
}
2281+
2282+
EXPECT_EQ(OK, surface->dequeueBuffers(&dequeuedBuffers));
2283+
EXPECT_EQ(INVALID_OPERATION, surface->dequeueBuffer(&buffer, &fence));
2284+
}
2285+
22402286
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
22412287

22422288
TEST_F(SurfaceTest, PlatformBufferMethods) {

0 commit comments

Comments
 (0)